Python 从类中的一个方法继承的两个方法在实例中是不同的,不是吗';不是吗?
有人能解释一下为什么会这样吗Python 从类中的一个方法继承的两个方法在实例中是不同的,不是吗';不是吗?,python,python-3.x,inheritance,Python,Python 3.x,Inheritance,有人能解释一下为什么会这样吗 class Foo: def bar(self): pass a = Foo() b = Foo() a.bar == b.bar # False a.bar is b.bar # False 我认为它们都继承了类方法,并且是唯一的方法。当您通过类上定义的实例访问函数时,每次都会创建一个绑定方法对象。从: 调用一个方法时会发生什么?你可能已经注意到了 调用x.f()时没有使用上述参数,即使 f()的函数定义指定了一个参数。发生什么事了
class Foo:
def bar(self):
pass
a = Foo()
b = Foo()
a.bar == b.bar # False
a.bar is b.bar # False
我认为它们都继承了类方法,并且是唯一的方法。当您通过类上定义的实例访问函数时,每次都会创建一个绑定方法对象。从: 调用一个方法时会发生什么?你可能已经注意到了 调用
x.f()
时没有使用上述参数,即使
f()
的函数定义指定了一个参数。发生什么事了
争论?当函数
要求在调用参数时不使用任何参数-即使参数
实际上没有使用
事实上,你可能已经猜到了答案:关于
方法是将实例对象作为
功能。在我们的示例中,调用x.f()
与
MyClass.f(x)
。通常,使用n个参数的列表调用方法
相当于使用参数调用相应的函数
通过在之前插入方法的实例对象而创建的列表
第一个论点
如果您仍然不了解方法的工作原理,请查看
实施或许可以澄清问题当实例属性
如果引用的不是数据属性,则将搜索其类。如果
名称表示一个有效的类属性,它是一个函数对象,一个
方法对象是通过打包(指向)实例对象而创建的
和函数对象一起出现在一个抽象对象中:
这是方法对象。
注意,每次访问方法时都会发生这种情况:
这是怎么回事?实际上,请注意存在一个\uuuu get\uuu
:
>>> def func(): pass
...
>>> func.__get__
<method-wrapper '__get__' of function object at 0x101e38ae8>
当然,它们不是用Python实现的(至少在CPython中是这样!)
另外请注意,直接在类上访问函数当然不能做到这一点(至少在Python3上是这样,您已经在问题中标记了它):
>>> def func(): pass
...
>>> func.__get__
<method-wrapper '__get__' of function object at 0x101e38ae8>
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)
>>> Foo.bar is Foo.bar
True