2010-11-06 107 views
8

在Ruby中,你可以這樣做:如何在python中創建類方法?

class A 
    def self.a 
     'A.a' 
    end 
end 

puts A.a #-> A.a 

這怎麼能在Python來完成。我需要調用一個類的方法,而不用在類的一個實例上調用它。當我嘗試這樣做,我得到這個錯誤:

unbound method METHOD must be called with CLASS instance as first argument (got nothing instead) 

這是我的嘗試:

class A 
    def a(): 
     return 'A.a' 

print A.a() 

回答

17

您要找的是staticmethod裝飾器,它可用於製作不需要第一個隱含參數的方法。它可以像這樣使用:

class A(object): 
    @staticmethod 
    def a(): 
     return 'A.a' 

在另一方面,如果你想從方法訪問類(而不是實例),你可以使用classmethod裝飾,其中大多采用相同的方式:

class A(object): 
    @classmethod 
    def a(cls): 
     return '%s.a' % cls.__name__ 

哪些可以仍然沒有instanciating對象(A.a())進行調用。

9

有兩種方法可以做到這一點:

@staticmethod 
def foo():  # No implicit parameter 
    print 'foo' 


@classmethod 
def foo(cls): # Class as implicit paramter 
    print cls 

不同的是,靜態方法完全沒有隱式參數。一個類方法接收所調用的類,方法與普通方法接收該實例的方式完全相同。

您使用哪一個取決於您是否希望該方法能夠訪問該類。

任何一個都可以在沒有實例的情況下調用。

0

您也可以使用__class__訪問靜態方法的類對象:

class A() : 
    @staticmethod 
    def a() : 
     return '{}.a'.format(__class__.__name__) 

至少這部作品在Python 3.1

+0

不2.X工作 – 2010-11-06 13:49:35