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):
您还可以通过以下方式创建绑定方法:
范例2:>>> some_instance = SomeClass()>>> SomeClass.__dict__['a_method'].__get__(some_instance, SomeClass)<bound method SomeClass.a_method of <__main__.SomeClass instance at 0xcafef00d>>
方法比较是通过方法上的
__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。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)