Python class class 之外的方法
Python classmethod outside the class
我必须使用一些 Python 库,其中包含具有各种实用程序的文件:classes 和方法。这些方法之一是按以下方式定义的(我无法放置整个代码):
@classmethod
def do_something(cls, args=None, **kwargs):
但是这个声明在任何 class 之外。我怎样才能访问这个方法?通过 do_something(myClass)
调用会出现错误:TypeError: 'classmethod' object is not callable
。在 classes 之外创建 class 方法的目的是什么?
装饰器生成一个 classmethod
对象。这样的对象是 descriptors(就像 staticmethod
、property
和函数对象)。
也许代码正在重新使用该对象作为这样的描述符。您可以稍后将其添加到 class:
ClassObject.attribute_name = do_something
或者您可以显式调用 descriptor.__get__
method。
通过将其存储为全局变量,检索起来更容易;如果你把它放在 class 上,你必须进入 class __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
我必须使用一些 Python 库,其中包含具有各种实用程序的文件:classes 和方法。这些方法之一是按以下方式定义的(我无法放置整个代码):
@classmethod
def do_something(cls, args=None, **kwargs):
但是这个声明在任何 class 之外。我怎样才能访问这个方法?通过 do_something(myClass)
调用会出现错误:TypeError: 'classmethod' object is not callable
。在 classes 之外创建 class 方法的目的是什么?
装饰器生成一个 classmethod
对象。这样的对象是 descriptors(就像 staticmethod
、property
和函数对象)。
也许代码正在重新使用该对象作为这样的描述符。您可以稍后将其添加到 class:
ClassObject.attribute_name = do_something
或者您可以显式调用 descriptor.__get__
method。
通过将其存储为全局变量,检索起来更容易;如果你把它放在 class 上,你必须进入 class __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