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

为什么这是假的?SomeClass.method是SomeClass.method,第1张

为什么这是假的?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



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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存