knkd
Июнь 23, 2011 23:16:32
Каким образом метакласс может узнать - в каком порядке инициализировались члены класса?
Ничего остроумнее чем хранить номер в переменой класса придумать не могу.
Но запуск в двух потоках одновременно приведёт к провалу…
Андрей Светлов
Июнь 23, 2011 23:34:29
Почитайте про __mro__
knkd
Июнь 24, 2011 00:06:20
Это ведь касается порядка поиска методов в суперклассах?
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:30:25
Да, порядок обращения к базовым классам.
Вероятно, я вас не понял. Вам нужен именно порядок инициализации членов класса?
Вы можете привести пример-иллюстрацию?
Андрей Светлов
Июнь 24, 2011 00:32:18
В метакласс передается dict членов. Уже готовый. Вся лавочка работает на импорте, когда никаких потоков быть не должно. И никаких соревнований — тоже.
knkd
Июнь 24, 2011 00:45:58
class ExtProgramm(blablabla):
__metaclass__ = MySpecialMeta
exe = ProgrammFile(r"C:\...")
# цимес тут - если параметров несколько, то нужно точно знать их порядок.
is_shoto = IOParam_Integer(...) # диалоговый параметр передаётся программе через stdio
...
is_chtoto = ConParam_String(...) # параметр коммандной строки
...
Можно конечно задавать порядок явно, одним из параметров соответствующего класса (ConParam_String(1, …) , ConParam_Float(2, …)).
Но хотелось уточнить.
Андрей Светлов
В метакласс передается dict членов. Уже готовый.
Знаю :(
Но хочется.
Андрей Светлов
Вся лавочка работает на импорте, когда никаких потоков быть не должно. И никаких соревнований — тоже.
Это уже интересно.
Андрей Светлов
Июнь 24, 2011 01:18:35
Понимаете ли, по хорошему программа сначала импортирует все модули и лишь затем запускает потоки.
Импорт из запущенного потока (а это возможно только если ваша функция внутри себя содержит import statement) — небезопасная операция, чреватая в том числе и dead lock. Если хотите — подробности опишу.
Запуск потока во время импорта (в верхнеуровневом коде модуля) хоть и возможен — но так делать не нужно.
Во всех иных случаях можно полагаться на счетчик. Потому что dict внутренностей класса создается строго последовательно.
o7412369815963
Июнь 24, 2011 12:11:59
> Понимаете ли, по хорошему программа сначала импортирует все модули и лишь затем запускает потоки.
а по ощущениям не так: питон сначала выполняет главный модуль, а import - операция подключения модуля и выполнения его. def и class так же, отрабатывают по мере выполнения.
Андрей Светлов
Июнь 24, 2011 13:44:04
o7412369815963
> Понимаете ли, по хорошему программа сначала импортирует все модули и лишь затем запускает потоки.
а по ощущениям не так: питон сначала выполняет главный модуль, а import - операция подключения модуля и выполнения его. def и class так же, отрабатывают по мере выполнения.
Именно! И не нужно делать так, чтобы импортирующийся модуль сам запускал потоки. Это довольно опасная схема.
Dimka665
Июль 13, 2011 12:51:06
В python 3 появился метод метакласса __prepare__, который позволяет изменять словарь, который будет использоваться для хранения всех элементов класса во время обработки тела класса.
http://python.org/dev/peps/pep-3115/В вашем случае можно использовать метод “использующийся в моделях Django”. Счетчик хранится в классе-предке ProgrammFile, ConParamString.