Python覆盖元类集属性

时间:2017-02-21 06:12:38

标签: python class override

假设我有一个班级:

class ABC:
    pass

我做了:

ABC.x = 123

即使我没有创建对象,这也不会给我一个错误。调用了哪个__func__方法,以及如何覆盖它?

1 个答案:

答案 0 :(得分:2)

您需要定义一个元类并在那里覆盖__setattr__,然后让您的类使用该元类。

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

然后:

>>> Foo.blah = 2
I am setting Foo.blah = 2
>>> Foo.blah
2