裝飾器產生一個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
你是什麼意思*在任何班級以外* *?你能提供[mcve]嗎? – jonrsharpe
此方法位於嵌套的頂層,沒有任何縮進。 – trivelt
有沒有可能你有一個自定義的裝飾器,叫做'classmethod',它會覆蓋這個鍵名。 –