Python重写元类集属性

Python重写元类集属性,python,class,overriding,Python,Class,Overriding,假设我有一门课: class ABC: pass 我确实: ABC.x = 123 这不会给我一个错误,即使我还没有创建对象。正在调用哪个\uuuuu func\uuuuu方法,以及如何重写它?您需要定义一个元类并在那里重写\uuuuuu setattr\uuuu,然后让您的类使用该元类 class Meta(type): def __new__(meta, name, bases, attrs): return super().__new__(meta, n

假设我有一门课:

class ABC:
    pass
我确实:

ABC.x = 123

这不会给我一个错误,即使我还没有创建对象。正在调用哪个
\uuuuu func\uuuuu
方法,以及如何重写它?

您需要定义一个元类并在那里重写
\uuuuuu setattr\uuuu
,然后让您的类使用该元类

class Meta(type):
    def __new__(meta, name, bases, attrs):
        return super().__new__(meta, name, bases, attrs)

    def __setattr__(cls, attr, value):
        print("I am setting {}.{} = {}".format(cls.__name__, attr, value))
        return super().__setattr__(attr, value)

class Foo(metaclass=Meta):
    pass
然后:


您需要定义一个元类并覆盖那里的
\uuuu setattr\uuuu
,然后让您的类使用该元类

class Meta(type):
    def __new__(meta, name, bases, attrs):
        return super().__new__(meta, name, bases, attrs)

    def __setattr__(cls, attr, value):
        print("I am setting {}.{} = {}".format(cls.__name__, attr, value))
        return super().__setattr__(attr, value)

class Foo(metaclass=Meta):
    pass
然后:


您正在设置类对象的属性。因此调用了
\uuuu setattr\uuuu
,但它是在元类上调用的。查阅元类,了解你的用意。@BrenBarn谢谢你的建议,我很快就会这么做。然而,为了解决我眼前的问题,你介意提交一个答案吗?:)您使用的是Python 2还是Python 3?@BrenBarn Python3您正在设置类对象的属性。因此调用了
\uuuu setattr\uuuu
,但它是在元类上调用的。查阅元类,了解你的用意。@BrenBarn谢谢你的建议,我很快就会这么做。然而,为了解决我眼前的问题,你介意提交一个答案吗?:)您使用的是Python 2还是Python 3?@BrenBarn Python3