我想有一个特殊的obj执行以下操作:
obj.newly_created_attribute = some_value
显然,所有对象都允许这样做。但是我希望以前的代码在new_created_attribute还不是obj的属性时自动调用方法。在我的特定情况下,我希望为obj.newly_created_attribute(现在是一个属性)设置一个自定义的get和set方法。
有没有办法做到这一点?有哪些方法可以指定在将新属性添加到对象时将运行的回调?
答案 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