Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从类中的一个方法继承的两个方法在实例中是不同的,不是吗';不是吗?_Python_Python 3.x_Inheritance - Fatal编程技术网

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