Python中关于属性回调的实现
来源:互联网 发布:28大神软件下载 编辑:程序博客网 时间:2024/06/08 08:14
问题的来源:
例如:
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__,然后使用函数指针重命名+字典访问的方法,
使属性名和函数指针名字相同,这样看起来是不是觉得好多了!
特别感谢csdn的ID:xyzxyz1111(程序员的自我修养) 指点!
例如:
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__,然后使用函数指针重命名+字典访问的方法,
使属性名和函数指针名字相同,这样看起来是不是觉得好多了!
特别感谢csdn的ID:xyzxyz1111(程序员的自我修养) 指点!
- Python中关于属性回调的实现
- 关于Python中一种回调方式的实现
- 关于属性中包含shadow的属性
- python中类的属性
- Python中实现多属性排序
- Python中实现多属性排序
- MySQLdb Python模块autocommit属性测试及测试过程中关于数据库连接的理解
- 关于Python类属性与实例属性的讨论
- 关于Python类属性与实例属性的讨论
- 关于Python类属性与实例属性的讨论
- 关于Python类属性与实例属性的讨论
- 关于依赖属性的验证回调
- 关于FireFox23.0.1中实现的按键事件对象key属性
- 关于android中使用weight属性实现多个layou比例布局的计算方法
- Python 中去除文件的只读属性
- python中模块的__name__属性
- python中模块的__all__属性
- python多线程中daemon的属性方法
- 存储过程解密(破解函数,过程,触发器,视图.仅限于SQLSERVER2000)
- Test1
- Servlet中的八大Listener
- Test2
- 对Unicode的误解
- Python中关于属性回调的实现
- 考研日志-23
- Boost.Signals简介
- vs2005的一个新东东‘SetCompatibleTextRenderingDefault’
- 在MSSQL中用查询分析器显示Long Text的内容
- C++ Standard Library Style Guidelines
- Web开发的常见问题解答
- Protel的下载地址和学习资料
- Java抽取Word,PDF的四种武器