Форум сайта python.su
Каким образом метакласс может узнать - в каком порядке инициализировались члены класса?
Ничего остроумнее чем хранить номер в переменой класса придумать не могу.
Но запуск в двух потоках одновременно приведёт к провалу…
Офлайн
Почитайте про __mro__
Офлайн
Это ведь касается порядка поиска методов в суперклассах?
class A(object):
a = int()
b = float()
class B:
c = complex()
d = ()
class C(A, B):
e = []
f = {}
c = C()
print c.__class__.__mro__ # (<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <type 'object'>)
Отредактировано (Июнь 24, 2011 00:09:56)
Офлайн
Да, порядок обращения к базовым классам.
Вероятно, я вас не понял. Вам нужен именно порядок инициализации членов класса?
Вы можете привести пример-иллюстрацию?
Офлайн
В метакласс передается dict членов. Уже готовый. Вся лавочка работает на импорте, когда никаких потоков быть не должно. И никаких соревнований — тоже.
Офлайн
class ExtProgramm(blablabla):
__metaclass__ = MySpecialMeta
exe = ProgrammFile(r"C:\...")
# цимес тут - если параметров несколько, то нужно точно знать их порядок.
is_shoto = IOParam_Integer(...) # диалоговый параметр передаётся программе через stdio
...
is_chtoto = ConParam_String(...) # параметр коммандной строки
...
Андрей СветловЗнаю :(
В метакласс передается dict членов. Уже готовый.
Андрей СветловЭто уже интересно.
Вся лавочка работает на импорте, когда никаких потоков быть не должно. И никаких соревнований — тоже.
Офлайн
Понимаете ли, по хорошему программа сначала импортирует все модули и лишь затем запускает потоки.
Импорт из запущенного потока (а это возможно только если ваша функция внутри себя содержит import statement) — небезопасная операция, чреватая в том числе и dead lock. Если хотите — подробности опишу.
Запуск потока во время импорта (в верхнеуровневом коде модуля) хоть и возможен — но так делать не нужно.
Во всех иных случаях можно полагаться на счетчик. Потому что dict внутренностей класса создается строго последовательно.
Офлайн
> Понимаете ли, по хорошему программа сначала импортирует все модули и лишь затем запускает потоки.
а по ощущениям не так: питон сначала выполняет главный модуль, а import - операция подключения модуля и выполнения его. def и class так же, отрабатывают по мере выполнения.
Офлайн
o7412369815963Именно! И не нужно делать так, чтобы импортирующийся модуль сам запускал потоки. Это довольно опасная схема.
> Понимаете ли, по хорошему программа сначала импортирует все модули и лишь затем запускает потоки.
а по ощущениям не так: питон сначала выполняет главный модуль, а import - операция подключения модуля и выполнения его. def и class так же, отрабатывают по мере выполнения.
Офлайн
В python 3 появился метод метакласса __prepare__, который позволяет изменять словарь, который будет использоваться для хранения всех элементов класса во время обработки тела класса. http://python.org/dev/peps/pep-3115/
В вашем случае можно использовать метод “использующийся в моделях Django”. Счетчик хранится в классе-предке ProgrammFile, ConParamString.
Офлайн