我无法理解classmethod对象在Python中是如何工作的,尤其是在元类和__new__
的上下文中。在我的特殊情况下,当我遍历members
的{{1}}时,我想得到一个classmethod成员的名字。
对于普通方法,名称只存储在__new__
属性中,但对于类方法,显然没有这样的属性。我甚至没有看到如何调用classmethod,因为也没有__name__
属性。
有人可以向我解释一下类方法是如何工作的,还是指向一些文档?谷歌搜索引导我无处可去。谢谢!
答案 0 :(得分:19)
classmethod
对象是描述符。您需要了解描述符的工作原理。
简而言之,描述符是一个具有方法__get__
的对象,它有三个参数:self
,instance
和instance type
。
在正常属性查找期间,如果查找对象A
具有方法__get__
,则会调用该方法,并为对象A
替换它返回的内容。当您在对象上调用方法时,这就是函数(也是描述符)成为绑定方法的方式。
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'
答案 1 :(得分:1)
This看起来有货。