2015-08-29 42 views
0

我必須使用一些包含具有各種實用程序的文件的Python庫:類和方法。其中一種方法定義如下(我不能把整個代碼):類之外的Python類方法

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

但這個聲明是在任何類之外。我怎樣才能訪問這種方法?通過do_something(myClass)調用出現錯誤:TypeError: 'classmethod' object is not callable。在類之外創建類方法的目的是什麼?

+0

你是什麼意思*在任何班級以外* *?你能提供[mcve]嗎? – jonrsharpe

+0

此方法位於嵌套的頂層,沒有任何縮進。 – trivelt

+1

有沒有可能你有一個自定義的裝飾器,叫做'classmethod',它會覆蓋這個鍵名。 –

回答

2

裝飾器產生一個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