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

为什么方法与自身不同?

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

为什么方法与自身不同?

当您请求一个实例的函数属性时,您将获得一个 绑定方法 :一个可调用对象,该对象包装了在类中定义的函数,并将实例作为第一个参数传递。在Python
2.x中,当您请求类的属性(即函数)时,会得到一个类似的代理对象,称为 未绑定方法

>>> class A: m = lambda: None...>>> A.m<unbound method A.<lambda>>

这个特殊对象是在您需要时创建的,并且显然没有缓存在任何地方。那意味着当你做

>>> A.m is A.mFalse

您正在创建两个 不同的 未绑定方法对象,并测试它们的身份。

注意

>>> x = A.m>>> x is xTrue

>>> A.m.im_func is A.m.im_funcTrue

工作正常。(

im_func
是未绑定方法对象包装的原始函数。)

顺便说一句,在Python 3.x中,它

C.m isC.m
是True,因为(几乎没有意义的)未绑定方法代理对象已被完全删除,而您只获得了定义的原始函数。


这只是Python属性查找非常动态的一个示例:当您请求对象的属性时,可以运行任意Python来计算该属性的值。这是另一个测试失败的示例,其中的原因更加清楚:

>>> class ChangingAttribute(object):...     @property...     def n(self):...  self._n += 1...  return self._n......     def __init__(self):...  self._n = 0...>>> foo = ChangingAttribute()>>> foo.n1>>> foo.n2>>> foo.n3>>> foo.n is foo.nFalse>>> foo.n6


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

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

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