类课外的Python类方法

时间:2015-08-29 08:50:13

标签: python class-method

我必须使用一些包含各种实用程序的文件的Python库:类和方法。其中一种方法是按以下方式定义的(我不能把整个代码放在一起):

@classmethod
def do_something(cls, args=None, **kwargs):

但是这个声明在任何一个类之外。我怎样才能访问此方法? do_something(myClass)致电会发出错误:TypeError: 'classmethod' object is not callable。在课外创建classmethods的目的是什么?

1 个答案:

答案 0 :(得分:3)

装饰器生成classmethod个对象。这些对象是descriptors(就像staticmethodproperty和函数对象一样。)

也许代码重新使用该对象作为这样的描述符。您可以稍后将其添加到课程中:

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