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

Python数据模型文档:未绑定的用户定义方法对象和类方法对象

Python数据模型文档:未绑定的用户定义方法对象和类方法对象,python,oop,object,methods,python-datamodel,Python,Oop,Object,Methods,Python Datamodel,在参考资料的数据模型中,作者花了大量精力解释了用户定义方法的创建和操作:(请参阅并向下滚动) 获取属性时,可以创建用户定义的方法对象 对于一个类(可能通过该类的立场),如果 属性是用户定义的函数对象,是未绑定的用户定义的 方法对象或类方法对象。当属性为 用户定义的方法对象,仅当 从中检索的类与或派生的类相同 类,存储在原始方法对象中的类;否则,, 原始方法对象按原样使用 那么一个未绑定的用户定义方法对象和一个类方法对象之间有什么区别呢?从“用户”的角度来看,Python中的类方法是一个将其类作为

在参考资料的数据模型中,作者花了大量精力解释了用户定义方法的创建和操作:(请参阅并向下滚动)

获取属性时,可以创建用户定义的方法对象 对于一个类(可能通过该类的立场),如果 属性是用户定义的函数对象,是未绑定的用户定义的 方法对象或类方法对象。当属性为 用户定义的方法对象,仅当 从中检索的类与或派生的类相同 类,存储在原始方法对象中的类;否则,, 原始方法对象按原样使用

那么一个未绑定的用户定义方法对象一个类方法对象之间有什么区别呢?

从“用户”的角度来看,Python中的类方法是一个将其类作为其第一个参数接收的方法-与“普通”不同方法,该方法接收类的实例作为其第一个参数,按惯例称为
self

如果从类中检索“普通”方法,而不是从该类的实例中检索,则会得到一个“未绑定方法”——即一个对象,它是函数的包装器,但在调用时不会自动将类本身或任何实例添加为第一个参数。如果要调用“unbound方法”,则必须手动传递其类的实例作为其第一个参数

另一方面,如果手动调用类方法,则该类将作为第一个参数填充:

>>> class A(object):
...   def b(self):
...      pass
...   @classmethod
...   def c(cls):
...      pass
... 
>>> A.b
<unbound method A.b>
>>> A.c
<bound method type.c of <class '__main__.A'>>
>>> A.c()
>>> A.b()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unbound method b() must be called with A instance as first argument (got nothing instead)
>>> 
如果要检索函数对象而不转换为方法对象,可以通过类的
\uuu dict\uuu
属性进行检索,该属性不会触发描述符:

>>> B.__dict__["c"]
<function c at 0x1927398>
>>> B.__dict__["c"].__get__
<method-wrapper '__get__' of function object at 0x1927398>
>>> B.__dict__["c"].__get__(b, B)
<bound method B.c of <__main__.B object at 0x1930a10>>
>>> B.__dict__["c"].__get__(None, B)
<unbound method B.c>
>>>B.uuuu dict_uuuuuuuuuuu[“c”]
>>>B.uuu dict_uuuuu[“c”]。uuuu get__
>>>B.uuu dict_uuuuu[“c”]。uuuu get_uuuu(B,B)
>>>B.uuu dict_uuuuu[“c”]。uuuu get_uuuu(无,B)

至于“类方法”,它们只是不同类型的对象,用内置的
classmethod
显式修饰的对象-调用其
\uuuu get\uuuu
时返回的对象是原始函数的包装器,它将填充
cls
作为调用时的第一个参数。

因此绑定/未绑定的用户定义方法是“实例的方法”,而类方法是“一个类的方法,对吗?换句话说,若你们试图直接从类中调用unbound方法,你们会得到异常,若要调用这个方法,你们必须先创建一个对象,然后调用这个方法”from“对象。若您想直接从类调用方法,可以使用decorator@staticmethod@Denis那么,当获取属性时,它是一个用
@classmethod
修饰的方法,我们可以说它是类的绑定方法吗?是的,然后它是一个classmethod,绑定到类。
>>> B.__dict__["c"]
<function c at 0x1927398>
>>> B.__dict__["c"].__get__
<method-wrapper '__get__' of function object at 0x1927398>
>>> B.__dict__["c"].__get__(b, B)
<bound method B.c of <__main__.B object at 0x1930a10>>
>>> B.__dict__["c"].__get__(None, B)
<unbound method B.c>