栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么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'


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/639060.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号