如何在元类中引用元类而不指定其名称?

0 投票
1 回答
63 浏览
提问于 2025-04-12 12:43

我有一些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__

这样也可以用来引用这个函数。

撰写回答