2017-02-21 98 views
-1

假设我有一个类:Python的覆盖元类集属性

class ABC: 
    pass 

而且我做的:

ABC.x = 123 

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

+0

你设置类对象的属性。所以'__setattr__'被调用,但它在元类上被调用。查找元类以了解您所处的位置。 – BrenBarn

+0

@BrenBarn感谢您的建议,我会尽快做到这一点。然而,为了解决我眼前的问题,你介意提交一个答案吗? :) –

+0

你使用Python 2还是Python 3? – BrenBarn

回答

1

您需要定义一个元类并在其中覆盖__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