gpt4 book ai didi

python - 作为类属性的函数赋值如何成为 Python 中的方法?

转载 作者:太空狗 更新时间:2023-10-29 18:29:15 25 4
gpt4 key购买 nike

>>> class A(object): pass
>>> def func(cls): pass
>>> A.func = func
>>> A.func
<unbound method A.func>

这个赋值如何创建一个方法?分配对类执行以下操作似乎不直观:

  • 将函数转换为未绑定(bind)的实例方法
  • 将包装在 classmethod() 中的函数转换为类方法(实际上,这很直观)
  • 将包装在 staticmethod() 中的函数转换为函数

似乎第一个应该有一个instancemethod(),而最后一个,根本不应该有一个包装函数。我知道这些是在 class block 中使用的,但为什么要在它之外应用呢?

但更重要的是,将函数分配到类中究竟是如何工作的?解决这 3 件事的魔法是什么?

更令人困惑的是:

>>> A.func
<unbound method A.func>
>>> A.__dict__['func']
<function func at 0x...>

但我认为这与描述符有关,当检索 属性时。我认为这与此处的属性设置关系不大。

最佳答案

你是对的,这与描述符协议(protocol)有关。描述符是如何在 Python 中实现将接收者对象作为方法的第一个参数传递的。您可以从 here 中阅读有关 Python 属性查找的更多详细信息。 .下面显示了较低级别的内容,当您执行 A.func = func; 时发生了什么; A.功能:

# A.func = func
A.__dict__['func'] = func # This just sets the attribute
# A.func
# The __getattribute__ method of a type object calls the __get__ method with
# None as the first parameter and the type as the second.
A.__dict__['func'].__get__(None, A) # The __get__ method of a function object
# returns an unbound method object if the
# first parameter is None.
a = A()
# a.func()
# The __getattribute__ method of object finds an attribute on the type object
# and calls the __get__ method of it with the instance as its first parameter.
a.__class__.__dict__['func'].__get__(a, a.__class__)
# This returns a bound method object that is actually just a proxy for
# inserting the object as the first parameter to the function call.

因此,查找类或实例上的函数将其转换为方法,而不是将其分配给类属性。

classmethodstaticmethod 只是描述符略有不同,classmethod 返回绑定(bind)到类型对象的绑定(bind)方法对象,而 staticmethod 只返回原始函数。

关于python - 作为类属性的函数赋值如何成为 Python 中的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2307653/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com