我想有一个特殊的obj执行以下操作:
obj.newly_created_attribute = some_value
Run Code Online (Sandbox Code Playgroud)
显然,所有对象都允许这样做.但是我希望以前的代码在new_created_attribute还不是obj的属性时自动调用方法.在我的特定情况下,我希望为obj.newly_created_attribute(现在是一个属性)设置一个自定义的get和set方法.
有没有办法做到这一点?某种方式指定每当将新属性添加到对象时将运行的回调?
您可以通过覆盖来实现此目的__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)
Run Code Online (Sandbox Code Playgroud)
__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
Run Code Online (Sandbox Code Playgroud)