Как уже было сказано, если вы намереваетесь изменить что-то вроде базовых классов или атрибутов, вам придется сделать это в __new__
. То же самое верно для name
класса, но, похоже, с ним есть особенность. Когда вы изменяете name
, он не распространяется на __init__
, хотя, например, attr
- это.
Итак, у вас будет:
class Meta(type):
def __new__(cls, name, bases, attr):
name = "A_class_named_" + name
return type.__new__(cls, name, bases, attr)
def __init__(cls, name, bases, attr):
print "I am still called '" + name + "' in init"
return super(Meta, cls).__init__(name, bases, attr)
class A(object):
__metaclass__ = Meta
print "Now I'm", A.__name__
печать
I am still called 'A' in init
Now I'm A_class_named_A
Это важно знать, если __init__
вызывает суперметакласс, который создает дополнительную магию. В этом случае необходимо изменить имя еще раз, прежде чем позвонить super.__init__
.