Найти - Пользователи
Полная версия: Порядок инициализации при создании класса
Начало » Python для экспертов » Порядок инициализации при создании класса
1
knkd
Каким образом метакласс может узнать - в каком порядке инициализировались члены класса?
Ничего остроумнее чем хранить номер в переменой класса придумать не могу.
Но запуск в двух потоках одновременно приведёт к провалу…
Андрей Светлов
Почитайте про __mro__
knkd
Это ведь касается порядка поиска методов в суперклассах?

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'>)
Андрей Светлов
Да, порядок обращения к базовым классам.
Вероятно, я вас не понял. Вам нужен именно порядок инициализации членов класса?
Вы можете привести пример-иллюстрацию?
Андрей Светлов
В метакласс передается dict членов. Уже готовый. Вся лавочка работает на импорте, когда никаких потоков быть не должно. И никаких соревнований — тоже.
knkd
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 членов. Уже готовый.
Знаю :(
Но хочется.

Андрей Светлов
Вся лавочка работает на импорте, когда никаких потоков быть не должно. И никаких соревнований — тоже.
Это уже интересно.
Андрей Светлов
Понимаете ли, по хорошему программа сначала импортирует все модули и лишь затем запускает потоки.
Импорт из запущенного потока (а это возможно только если ваша функция внутри себя содержит import statement) — небезопасная операция, чреватая в том числе и dead lock. Если хотите — подробности опишу.
Запуск потока во время импорта (в верхнеуровневом коде модуля) хоть и возможен — но так делать не нужно.
Во всех иных случаях можно полагаться на счетчик. Потому что dict внутренностей класса создается строго последовательно.
o7412369815963
> Понимаете ли, по хорошему программа сначала импортирует все модули и лишь затем запускает потоки.
а по ощущениям не так: питон сначала выполняет главный модуль, а import - операция подключения модуля и выполнения его. def и class так же, отрабатывают по мере выполнения.
Андрей Светлов
o7412369815963
> Понимаете ли, по хорошему программа сначала импортирует все модули и лишь затем запускает потоки.
а по ощущениям не так: питон сначала выполняет главный модуль, а import - операция подключения модуля и выполнения его. def и class так же, отрабатывают по мере выполнения.
Именно! И не нужно делать так, чтобы импортирующийся модуль сам запускал потоки. Это довольно опасная схема.
Dimka665
В python 3 появился метод метакласса __prepare__, который позволяет изменять словарь, который будет использоваться для хранения всех элементов класса во время обработки тела класса. http://python.org/dev/peps/pep-3115/
В вашем случае можно использовать метод “использующийся в моделях Django”. Счетчик хранится в классе-предке ProgrammFile, ConParamString.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB