检测何时将新属性添加到Python中的对象?

时间:2011-09-14 20:15:02

标签: python

我想有一个特殊的obj执行以下操作:

obj.newly_created_attribute = some_value

显然,所有对象都允许这样做。但是我希望以前的代码在new_created_attribute还不是obj的属性时自动调用方法。在我的特定情况下,我希望为obj.newly_created_attribute(现在是一个属性)设置一个自定义的get和set方法。

有没有办法做到这一点?有哪些方法可以指定在将新属性添加到对象时将运行的回调?

3 个答案:

答案 0 :(得分:6)

您可以通过覆盖__setattr__

来实现此目的
class SomeClass(object):
    def __setattr__(self, name, value):
        if not hasattr(self, name):
            print "new attribute", name
            # do stuff here
        return object.__setattr__(self, name, value)

答案 1 :(得分:5)

__setattr__会帮助你:

  

尝试进行属性分配时调用。这被称为代替正常机制(即将值存储在实例字典中)。 name是属性名称,value是要分配给它的值。

#!/usr/bin/env python

class Klass(object):

    def __setattr__(self, name, value):
        if not hasattr(self, name):
            self.on_first_setattr()
        return object.__setattr__(self, name, value)

    def on_first_setattr(self):
        print "I am just a callback and my story's seldom told."

obj = Klass()
obj.some_attr = 1 # will call callback
obj.some_attr = 2 # no output

答案 2 :(得分:3)

重载__setattr__。例如:

class Foo(object):
    def __setattr__(self, attr, val):
        print "setattr"
        if attr not in self.__dict__:
            print "new attr:", attr
            self.__dict__[attr] = val
        else:
            print "extant attr:", attr
            self.__dict__[attr] = val