gpt4 book ai didi

python - 类方法对象如何工作?

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

我很难理解类方法对象在 Python 中是如何工作的,尤其是在元类的上下文中和 __new__ 中。在我的特殊情况下,当我遍历提供给 __new__members 时,我想获得类方法成员的名称。

对于普通方法,名称只是存储在 __name__ 属性中,但对于类方法,显然没有这样的属性。我什至没有看到类方法是如何被调用的,因为也没有 __call__ 属性。

有人可以向我解释类方法的工作原理或向我指出一些文档吗?谷歌搜索让我无处可去。谢谢!

最佳答案

classmethod 对象是一个描述符。您需要了解描述符的工作原理。

简而言之,描述符是一个对象,它有一个方法__get__,它接受三个参数:self,一个instance,和实例类型

在正常的属性查找期间,如果查找的对象 A 有一个方法 __get__,该方法将被调用,并且它返回的内容将替换为对象 A。当您在对象上调用方法时,函数(也是描述符)就是这样成为绑定(bind)方法的。

class Foo(object):
def bar(self, arg1, arg2):
print arg1, arg2

foo = Foo()
# this:
foo.bar(1,2) # prints '1 2'
# does about the same thing as this:
Foo.__dict__['bar'].__get__(foo, type(foo))(1,2) # prints '1 2'

classmethod 对象的工作方式相同。当它被查找时,它的 __get__ 方法被调用。类方法的 __get__ 丢弃对应于 instance 的参数(如果有的话)并且只在调用 时传递 instance_type >__get__ 在包装函数上。

说明性涂鸦:

In [14]: def foo(cls):
....: print cls
....:
In [15]: classmethod(foo)
Out[15]: <classmethod object at 0x756e50>
In [16]: cm = classmethod(foo)
In [17]: cm.__get__(None, dict)
Out[17]: <bound method type.foo of <type 'dict'>>
In [18]: cm.__get__(None, dict)()
<type 'dict'>
In [19]: cm.__get__({}, dict)
Out[19]: <bound method type.foo of <type 'dict'>>
In [20]: cm.__get__({}, dict)()
<type 'dict'>
In [21]: cm.__get__("Some bogus unused string", dict)()
<type 'dict'>

可以在此处(以及其他地方)找到有关描述符的更多信息: http://users.rcn.com/python/download/Descriptor.htm

对于获取由 classmethod 包装的函数名称的特定任务:

In [29]: cm.__get__(None, dict).im_func.__name__
Out[29]: 'foo'

关于python - 类方法对象如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1677468/

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