我必须使用一些包含各种实用程序的文件的Python库:类和方法。其中一种方法是按以下方式定义的(我不能把整个代码放在一起):
@classmethod
def do_something(cls, args=None, **kwargs):
但是这个声明在任何一个类之外。我怎样才能访问此方法? do_something(myClass)
致电会发出错误:TypeError: 'classmethod' object is not callable
。在课外创建classmethods的目的是什么?
答案 0 :(得分:3)
装饰器生成classmethod
个对象。这些对象是descriptors(就像staticmethod
,property
和函数对象一样。)
也许代码重新使用该对象作为这样的描述符。您可以稍后将其添加到课程中:
ClassObject.attribute_name = do_something
或者您可以明确调用descriptor.__get__
method。
通过将其存储为全局,更容易检索;如果你把它放在一个类上,你必须进入类__dict__
属性来检索classmethod
描述符而不调用它:
ClassObject.__dict__['do_something']
直接属性访问会导致Python为您调用descriptor.__get_
方法,返回绑定方法:
>>> class Foo(object):
... @classmethod
... def bar(cls):
... print 'called bar on {}'.format(cls.__name__)
...
>>> Foo.bar
<bound method type.bar of <class '__main__.Foo'>>
>>> Foo.bar()
called bar on Foo
>>> Foo.__dict__['bar']
<classmethod object at 0x1076b20c0>
>>> Foo.__dict__['bar'].__get__(None, Foo)
<bound method type.bar of <class '__main__.Foo'>>
>>> Foo.__dict__['bar'].__get__(None, Foo)()
called bar on Foo