为什么setattr在绑定方法上失败

为什么setattr在绑定方法上失败,第1张

为什么setattr在绑定方法上失败

简短的答案:无法将自定义属性添加到绑定方法。

长答案如下。

在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'


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5644868.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存