如何在元类中引用元类而不指定其名称?
我有一些Python代码:
class Meta(type):
def __new__(cls, name, base, attrs):
attrs.update({'name': '', 'email': ''})
return super().__new__(cls, name, base, attrs)
def __init__(cls, name, base, attrs):
super().__init__(name, base, attrs)
cls.__init__ = Meta.func
def func(self, *args, **kwargs):
setattr(self, 'LOCAL', True)
class Man(metaclass=Meta):
login = 'user'
psw = '12345'
我想知道如何在一个元类里面引用这个元类,而不需要在代码中写出它的名字?比如在这一行:cls.__init__ = Meta.func
中,不想写Meta
。
如果有人想改这个元类的名字,代码就会失效。因为那样的话,就得在这个元类里面做修改,因为我在代码中明确写了它的名字。我觉得这样不太对,但我不知道该怎么用其他方式来表达。
我试过用cls.__init__ = cls.func
,但这样并没有为Man类的对象创建局部变量。cls
指的是正在创建的类(Man
),而不是Meta
。
1 个回答
2
我怎么能在一个元类里面引用另一个元类,而不需要在代码中写出它的名字?比如,不用在这一行:cls.init = Meta.func 中写“Meta”。
你可以使用一个特殊的变量名 __class__
,就像这样:
cls.__init__ = __class__.__init__
否则,在元类的 __init__
方法中,第一个“cls”参数实际上是指向这个类的类(也就是元类),就像普通的 self
参数一样:
cls.__init__ = cls.__class__.__init__
这样也可以用来引用这个函数。