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

Ste*_*gle 2 python

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

obj.newly_created_attribute = some_value
Run Code Online (Sandbox Code Playgroud)

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

有没有办法做到这一点?某种方式指定每当将新属性添加到对象时将运行的回调?

And*_*ark 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)
Run Code Online (Sandbox Code Playgroud)


mik*_*iku 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
Run Code Online (Sandbox Code Playgroud)