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

从类的一个方法继承的两个方法在实例上是不同的,不是吗?

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

从类的一个方法继承的两个方法在实例上是不同的,不是吗?

通过类上定义的实例访问函数时,每次都会创建一个 绑定方法
对象。从文档:

调用方法时到底发生了什么?您可能已经注意到

x.f()
上面调用了不带参数的方法,即使
f()
指定了参数的函数定义也是如此。争论发生了什么?当没有任何参数调用需要参数的函数时,Python当然会引发异常-
即使该参数并未实际使用。

实际上,您可能已经猜到了答案:方法的特殊之处在于,实例对象作为函数的第一个参数传递。在我们的示例中,该调用

x.f()
与完全等效
MyClass.f(x)
。通常,调用带有n个参数列表的方法等效于调用带有参数列表的函数,该参数列表是通过在第一个参数之前插入方法的实例对象而创建的。

如果您仍然不了解方法的工作方式,那么看一下实现也许可以澄清问题。 当引用的实例属性不是数据属性时,将搜索其类。
如果名称表示作为函数对象的有效类属性,则通过将实例对象和刚在抽象对象中一起找到的函数对象打包(指向)来创建方法对象:这是方法对象。

请注意, 每次您访问方法都会 发生这种情况:

>>> class Foo:...    def bar(self): pass...>>> f = Foo()>>> f.bar is f.barFalse

这是如何运作的?好吧,实际上,函数
是描述符对象 ,请注意a的存在

__get__

>>> def func(): pass...>>> func.__get__<method-wrapper '__get__' of function object at 0x101e38ae8>

换句话说,您可以认为Python函数是这样实现的:

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

当然,它们不是在Python中实现的(至少在CPython中!)。

还要注意,直接在类上访问函数当然不会这样做(至少在Python 3上,您已在问题上对其进行了标记):

>>> Foo.bar is Foo.barTrue


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

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

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