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

为什么这是假的?SomeClass.method是SomeClass.method

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

为什么这是假的?SomeClass.method是SomeClass.method

范例1:

Someclass.a_method
是一种 未绑定的方法 。这些在当今的Python中甚至都不存在,因此请认为这是无用的历史课程。

每次引用时,Python都会复制该方法吗?

是的,或多或少。这是通过描述符协议完成的。

>>> SomeClass.a_method  # unbound method via attribute access<unbound method SomeClass.a_method>>>> SomeClass.__dict__['a_method']  # just stored as a function in the class dict<function __main__.a_method>>>> SomeClass.__dict__['a_method'].__get__(None, SomeClass)<unbound method SomeClass.a_method>

最后一行显示了描述符为类上的属性访问而调用的“绑定”操作,但是是手动写出的。在纯Python中,就像这样

class Function(object):    def __get__(self, obj, objtype=None):        "Simulate func_descr_get() in Objects/funcobject.c"        return types.MethodType(self, obj, objtype):

您还可以通过以下方式创建绑定方法:

>>> some_instance = SomeClass()>>> SomeClass.__dict__['a_method'].__get__(some_instance, SomeClass)<bound method SomeClass.a_method of <__main__.SomeClass instance at 0xcafef00d>>

范例2:

方法比较是通过方法上的

__func__
__self__
属性完成的。在这种情况下,它们是相同的:the
__func__
是可以从类dict中挖掘出来的相同的老式函数,
__self__
is是
None
。因此,尽管这些方法是不同的对象,但它们比较相等。

范例3:

正确。它们是不同的对象,因此不相同。

范例4:

如前所述,比较使用

__func__
__self__
属性。结果与示例2不匹配,因为在这种情况下,
__self__
属性引用的是不同的实例。那些不同的实例之所以不相等,是因为
SomeClass
实例按身份进行比较,因此这些方法也不相等。

关于当前版本的Python的最后说明

示例1 之外,上述所有内容均适用于该语言的当前版本。在Python中,不再有未绑定方法之类的东西,对象模型中这种不必要的复杂性已被消除。

>>> SomeClass.a_method<function __main__.SomeClass.a_method(self)>>>> SomeClass.a_method is SomeClass.__dict__['a_method']True

现在,Python 2中的“未绑定方法”只是一个普通的旧函数,并且通过属性访问检索的实例与dict类中的对象相同。在Python 2-> Python
3升级中, 示例1的 结果从

False
变为
True



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

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

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