Редактировать: Теперь, посмотрев на IterRegistry
и DeclarativeMeta
, я думаю, с вашим кодом все в порядке.
IterRegistry
определяет __new__
и __iter__
, а DeclarativeMeta
определяет __init__
и __setattr__
.Поскольку перекрытия нет, прямой необходимости звонить super
нет.Тем не менее, было бы неплохо сделать так, чтобы ваш код соответствовал будущему.
У вас есть контроль над определением Meta
?Можете ли вы показать нам его определение?Я не думаю, что мы можем сказать, что это работает или не работает, если мы не увидим определение Meta
.
Например, существует потенциальная проблема, если ваш Meta
не вызывает super(Meta,cls).__init__(classname, bases, dict_)
Если вы запустите этот код
class DeclarativeMeta(type):
def __init__(cls, classname, bases, dict_):
print('DeclarativeMeta')
# if '_decl_class_registry' in cls.__dict__:
# return type.__init__(cls, classname, bases, dict_)
# _as_declarative(cls, classname, dict_)
return type.__init__(cls, classname, bases, dict_)
class Meta(type):
def __init__(cls, classname, bases, dict_):
print('Meta')
return type.__init__(cls, classname, bases, dict_)
class NewMeta(Meta,DeclarativeMeta): pass
class MyBase(object):
__metaclass__ = NewMeta
pass
, то будет напечатана только строка 'Meta'
.Другими словами, только Meta.__init__
запускается.DeclarativeMeta.__init__
пропускается.
С другой стороны, если вы определите
class Meta(type):
def __init__(cls, classname, bases, dict_):
print('Meta')
return super(Meta,cls).__init__(classname, bases, dict_)
, тогда запускаются оба Meta.__init__
и DeclarativeMeta.__init__
.