tri*_*elt 4 python class-method
我必须使用一些 Python 库,其中包含具有各种实用程序的文件:类和方法。其中一种方法是按以下方式定义的(我无法放置完整代码):
@classmethod
def do_something(cls, args=None, **kwargs):
Run Code Online (Sandbox Code Playgroud)
但这个声明是在任何类之外的。我怎样才能访问这个方法?调用 bydo_something(myClass)会出现错误:TypeError: 'classmethod' object is not callable。在类之外创建类方法的目的是什么?
装饰器生成一个classmethod对象。这些对象是描述符(就像staticmethod,property和函数对象一样)。
也许代码正在重新使用该对象作为这样的描述符。您可以稍后将其添加到课程中:
ClassObject.attribute_name = do_something
Run Code Online (Sandbox Code Playgroud)
或者您可以显式调用该descriptor.__get__方法。
通过将其存储为全局变量,可以更轻松地检索;如果你把它放在一个类上,你必须进入类__dict__属性来检索classmethod描述符而不调用它:
ClassObject.__dict__['do_something']
Run Code Online (Sandbox Code Playgroud)
因为直接属性访问会导致 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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1803 次 |
| 最近记录: |