简短的答案:无法将自定义属性添加到绑定方法。
长答案如下。
在Python中,有 函数对象 和 方法对象 。当定义一个类时,该
def语句创建一个 函数对象 ,该 对象 位于该类的名称空间中:
>>> class c:... def m(self):... pass...>>> c.m<function m at 0x025FAE88>
函数对象具有特殊的
__dict__属性,可以保存用户定义的属性:
>>> c.m.i = 0>>> c.m.__dict__{'i': 0}
方法对象是不同的野兽。它们是微小的对象,仅持有对相应功能对象(
__func__)的引用,并对其宿主对象(
__self__)的引用:
>>> c().m<bound method c.m of <__main__.c object at 0x025206D0>>>>> c().m.__self__<__main__.c object at 0x02625070>>>> c().m.__func__<function m at 0x025FAE88>>>> c().m.__func__ is c.mTrue
方法对象提供了一种特殊
__getattr__的功能,可将属性访问转发给功能对象:
>>> c().m.i0
对于该
__dict__属性也是如此:
>>> c().m.__dict__['a'] = 42>>> c.m.a42>>> c().m.__dict__ is c.m.__dict__True
但是,设置属性遵循默认规则,并且由于它们没有自己的
__dict__属性,因此无法设置任意属性。
这类似于定义
__slots__且没有
__dict__插槽的用户定义类,当尝试设置一个不存在的插槽时会引发一个
AttributeError(请参阅文档,
__slots__以获取更多信息):
>>> class c:... __slots__ = ('a', 'b')...>>> x = c()>>> x.a = 1>>> x.b = 2>>> x.c = 3Traceback (most recent call last): File "<stdin>", line 1, in <module>AttributeError: 'c' object has no attribute 'c'
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)