Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.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 - Fatal编程技术网

Python 类的方法之间的差异,即;功能“;哪些是「;“绑定方法”;?

Python 类的方法之间的差异,即;功能“;哪些是「;“绑定方法”;?,python,python-3.x,Python,Python 3.x,我做了一点实验。通过检查类或实例的\u dict\u,我可以看到一些方法具有type函数和一些绑定方法。实验很混乱,我想不出以下问题 在Python3中,类或实例的方法(即“函数”和“绑定方法”)之间有什么区别 它们分别是如何创建的 它们可以同时在类和实例上调用吗?它们都会被隐式地给出一个实例作为它们的第一个参数吗 “绑定方法”是类的属性还是类的实例 谢谢。这个答案将非常技术性,但我希望它仍然可以理解。问题在于,要理解Python中的方法是如何工作的,需要了解描述符协议 Python3中的所有函

我做了一点实验。通过检查类或实例的
\u dict\u
,我可以看到一些方法具有type
函数
和一些
绑定方法
。实验很混乱,我想不出以下问题

在Python3中,类或实例的方法(即“函数”和“绑定方法”)之间有什么区别

它们分别是如何创建的

它们可以同时在类和实例上调用吗?它们都会被隐式地给出一个实例作为它们的第一个参数吗

“绑定方法”是类的属性还是类的实例


谢谢。

这个答案将非常技术性,但我希望它仍然可以理解。问题在于,要理解Python中的方法是如何工作的,需要了解描述符协议

Python3中的所有函数都是非数据描述符。这意味着他们实现了一个
\uuuuuuuuuuuuuuuuu
方法,但没有
\uuuuuuuuuuuuu
方法

这很有趣,因为如果在类或实例上查找描述符,描述符几乎可以做任何事情

根据中的
\uuuu get\uuuu
方法的定义:

object.\uuuu获取(self、instance、owner)

调用以获取所有者类的属性(类属性访问)或该类的实例的属性(实例属性访问)
owner
始终是owner类,而
instance
是通过访问属性的实例,或者
None
是通过
owner
访问属性的实例。此方法应返回(计算的)属性值或引发
AttributeError
异常

那么这与
函数
绑定方法
之间的差异有什么关系呢

这很简单,通过
获取
访问的带有
实例=None
的函数将返回自身:

>>> def func(x): return x
>>> func.__get__(None, object)
<function __main__.func>
>>> func.__get__(None, object) is func
True
它基本上只是一个
func
的包装器,其中存储了实例:

>>> m = func.__get__(object())
>>> m.__self__   # stored instance
<object at 0x155614a0650>

>>> m.__func__  # stored function
<function __main__.func>
staticmethod
s始终显示为函数,因为它们从不传递函数的任何附加内容:

>>> m()
<object at 0x155614a0650>
class Test(object):
    @staticmethod
    def func(x):
        return x
    
>>> Test().func
<function __main__.Test.func>
>>> Test.func
<function __main__.Test.func>
类测试(对象):
@静力学方法
def func(x):
返回x
>>>Test().func
>>>Test.func

因此,很容易在类上看到
绑定方法
s(例如
类方法
s),同样,在实例上也可以找到正常的
函数
s(例如
静态方法
s)。

这个答案确实是技术性的,但我希望它仍然可以理解。问题在于,要理解Python中的方法是如何工作的,需要了解描述符协议

Python3中的所有函数都是非数据描述符。这意味着他们实现了一个
\uuuuuuuuuuuuuuuuu
方法,但没有
\uuuuuuuuuuuuu
方法

这很有趣,因为如果在类或实例上查找描述符,描述符几乎可以做任何事情

根据中的
\uuuu get\uuuu
方法的定义:

object.\uuuu获取(self、instance、owner)

调用以获取所有者类的属性(类属性访问)或该类的实例的属性(实例属性访问)
owner
始终是owner类,而
instance
是通过访问属性的实例,或者
None
是通过
owner
访问属性的实例。此方法应返回(计算的)属性值或引发
AttributeError
异常

那么这与
函数
绑定方法
之间的差异有什么关系呢

这很简单,通过
获取
访问的带有
实例=None
的函数将返回自身:

>>> def func(x): return x
>>> func.__get__(None, object)
<function __main__.func>
>>> func.__get__(None, object) is func
True
它基本上只是一个
func
的包装器,其中存储了实例:

>>> m = func.__get__(object())
>>> m.__self__   # stored instance
<object at 0x155614a0650>

>>> m.__func__  # stored function
<function __main__.func>
staticmethod
s始终显示为函数,因为它们从不传递函数的任何附加内容:

>>> m()
<object at 0x155614a0650>
class Test(object):
    @staticmethod
    def func(x):
        return x
    
>>> Test().func
<function __main__.Test.func>
>>> Test.func
<function __main__.Test.func>
类测试(对象):
@静力学方法
def func(x):
返回x
>>>Test().func
>>>Test.func
因此,很容易在类上看到
bound method
s(例如
classmethod
s),同样,在实例(例如
staticmethod
s)上也可以找到正常的
函数。“所以很容易在类上有绑定方法,在实例上有普通函数”,对于什么样的方法?普通方法在实例上有绑定方法,在类上有普通函数,静态方法在类和实例上都有函数,类方法在类和实例上都有绑定方法。这三个“在类上没有绑定方法,在实例上没有普通函数”。@Tim我在写这句话时不是指同一个“方法”,但是用自己的描述符很容易做到。我对答案进行了编辑,使其不那么模棱两可:)谢谢。“所以很容易在类上有绑定方法,在实例上有普通函数”,对于什么样的方法?普通方法在实例上有绑定方法,在类上有普通函数,静态方法在类和实例上都有函数,类方法在类和实例上都有绑定方法。这三个“在类上没有绑定方法,在实例上没有普通函数”。@Tim我在写这句话时不是指同一个“方法”,但是用自己的描述符很容易做到。我对答案进行了编辑,使其不那么模棱两可:)