Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 23, 2011 23:16:32

knkd
От:
Зарегистрирован: 2009-06-14
Сообщения: 225
Репутация: +  0  -
Профиль   Отправить e-mail  

Порядок инициализации при создании класса

Каким образом метакласс может узнать - в каком порядке инициализировались члены класса?
Ничего остроумнее чем хранить номер в переменой класса придумать не могу.
Но запуск в двух потоках одновременно приведёт к провалу…



Офлайн

#2 Июнь 23, 2011 23:34:29

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Порядок инициализации при создании класса

Почитайте про __mro__



Офлайн

#3 Июнь 24, 2011 00:06:20

knkd
От:
Зарегистрирован: 2009-06-14
Сообщения: 225
Репутация: +  0  -
Профиль   Отправить e-mail  

Порядок инициализации при создании класса

Это ведь касается порядка поиска методов в суперклассах?

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)

Офлайн

#4 Июнь 24, 2011 00:30:25

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Порядок инициализации при создании класса

Да, порядок обращения к базовым классам.
Вероятно, я вас не понял. Вам нужен именно порядок инициализации членов класса?
Вы можете привести пример-иллюстрацию?



Офлайн

#5 Июнь 24, 2011 00:32:18

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Порядок инициализации при создании класса

В метакласс передается dict членов. Уже готовый. Вся лавочка работает на импорте, когда никаких потоков быть не должно. И никаких соревнований — тоже.



Офлайн

#6 Июнь 24, 2011 00:45:58

knkd
От:
Зарегистрирован: 2009-06-14
Сообщения: 225
Репутация: +  0  -
Профиль   Отправить e-mail  

Порядок инициализации при создании класса

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 членов. Уже готовый.
Знаю :(
Но хочется.

Андрей Светлов
Вся лавочка работает на импорте, когда никаких потоков быть не должно. И никаких соревнований — тоже.
Это уже интересно.



Офлайн

#7 Июнь 24, 2011 01:18:35

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Порядок инициализации при создании класса

Понимаете ли, по хорошему программа сначала импортирует все модули и лишь затем запускает потоки.
Импорт из запущенного потока (а это возможно только если ваша функция внутри себя содержит import statement) — небезопасная операция, чреватая в том числе и dead lock. Если хотите — подробности опишу.
Запуск потока во время импорта (в верхнеуровневом коде модуля) хоть и возможен — но так делать не нужно.
Во всех иных случаях можно полагаться на счетчик. Потому что dict внутренностей класса создается строго последовательно.



Офлайн

#8 Июнь 24, 2011 12:11:59

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Порядок инициализации при создании класса

> Понимаете ли, по хорошему программа сначала импортирует все модули и лишь затем запускает потоки.
а по ощущениям не так: питон сначала выполняет главный модуль, а import - операция подключения модуля и выполнения его. def и class так же, отрабатывают по мере выполнения.

Офлайн

#9 Июнь 24, 2011 13:44:04

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Порядок инициализации при создании класса

o7412369815963
> Понимаете ли, по хорошему программа сначала импортирует все модули и лишь затем запускает потоки.
а по ощущениям не так: питон сначала выполняет главный модуль, а import - операция подключения модуля и выполнения его. def и class так же, отрабатывают по мере выполнения.
Именно! И не нужно делать так, чтобы импортирующийся модуль сам запускал потоки. Это довольно опасная схема.



Офлайн

#10 Июль 13, 2011 12:51:06

Dimka665
От:
Зарегистрирован: 2008-09-19
Сообщения: 177
Репутация: +  0  -
Профиль   Отправить e-mail  

Порядок инициализации при создании класса

В python 3 появился метод метакласса __prepare__, который позволяет изменять словарь, который будет использоваться для хранения всех элементов класса во время обработки тела класса. http://python.org/dev/peps/pep-3115/
В вашем случае можно использовать метод “использующийся в моделях Django”. Счетчик хранится в классе-предке ProgrammFile, ConParamString.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version