属性回调的方法尝试

问题的来源:
例如:
def onchange_attrib(new_value):
    print "onchange_attrib"

class obj:
    attrib = 0
    def__init__():
        pass

test = obj()
test.attrib = 10

我希望在运行test.attrib = 10之后,能自动调用onchange_attrib函数,也就是要绑定attrib和onchange_attrib的关系;
可以说是一种属性回调,当然解决这个问题的方法有很多
例如:
def onchange_attrib(new_value):
    print "onchange_attrib"

class obj:
    attrib = 0
    def__init__(self):
        pass
    def setAttrib(self, value):
        self.attrib = value
        onchange_attrib(value)

test = obj()
test.setAttrib(10)

************************************************************

那么还有一些别的方法:
def onchange_attrib(new_value):
    print "onchange_attrib"

class ObjCls:
    def __setattr__(self, name, value):
        self.__dict__[name] = value
        if name == 'attrib':
            onchange_attrib(value)

test = ObjCls()
test.attrib = 10

------------------------------------------
输出结果:
>>> ================================ RESTART ================================
>>>
onchange_attrib
10
>>>

我在《Python编程金典》第八章第三节所见,以及Python2.5 帮助中LanguageReference/3.DataModel/
3.4Special method names/3.4.2Customizing attribute access中的意思,
但在__setattr__()函数中,我必须对所有的属性来个if判断,那么这个函数将会很长很长,
如果出现继承关系,那么我就必须对__setattr__()进行逻辑结构的控制。
(某某数学家说过:看起来不美观的公式,一定是错误的公式
===>>>看起来不美观的程序,也一定是有问题的程序。。。[个人观点])
动态语言不同于C#之类的语言,不存在早期绑定和晚期绑定之说,需要用时随时调用。
但如果能在早期绑定那就最好了!如果真的不行,那我也就认命了。

改进一下:
def watch_attrib1(obj, value):
    print "attrib1 changes to", value

def watch_attrib2(obj, value):
    print "attrib2 changes to", value

watchers = {
    "attrib1": watch_attrib1,
    "attrib2": watch_attrib2,
}

class ObjCls:
    def __setattr__(self, name,value):
        self.__dict__[name] = value
        func = watchers.get(name)
        if func:
            func(self, value)

test = ObjCls()
test.attrib2 = 10
test.attrib1 = test.attrib2 + 6

使用重载_setattr__,然后使用函数指针重命名+字典访问的方法,
使属性名和函数指针名字相同,这样看起来是不是觉得好多了!

 

特别注意:实际上这个还不是最终想要的一种结果!我更希望它能自动完成。不用写某属性对应某方法的例如watchers这样的东西。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值