2015-12-02 68 views
0

嗨我正在與不同的協作者在一個項目中開發一個類。我已經能夠用不同的方法實現這個類,並且所有工作都正常。基本上我現在的情況是下面python類與混合@classmethod和方法

class MyClass(object): 
    def __init__(self,a,b,c): 
     self.a = a 
     self.b = b 
     self.c = c 

    def one(self,**kwargs): 
     d = self.two() 
     e = self.three() 
     # make something using a an b like 
     return 2*d + 3*e 

    def two(self,**kwargs): 
     # this uses a for example 
     return self.a*2 + self.b**self.c 
    def three(self, **kwargs): 
     # this uses b and c 
     return self.b/self.c - self.a/3 

這些顯然例子,還有更多複雜的東西怎麼回事。問題是,這個類只能通過

[1]: x=MyClass(a,b,c) 
[2]: y=x.one() 

類插入一個更大的項目和其他合作者想直接調用一個沒有istance作爲

[1]: y = MyClass.one(a,b,c) 
[2]: z = MyClass.two(a,b,c) 
[3]: x = MyClass.three(a,b,c) 

我一個實例調用知道我可以通過使用裝飾器(如@classmethod)來獲得此信息。例如,對於一個我不喜歡

@classmethod 
def one(cls, a, b, c): 
    d = self.two() 
    e = self.three() 
    cos(2*d+3*e) 

但其實這不工作,因爲它是自沒有定義引發錯誤。我的問題是,我不明白如果我沒有創建實例,@classmethod如何調用另一個屬於同一類的方法。順便說一句我正在研究python 2.7 感謝您的任何線索。我試着在各種@classmethod問題搜索,但沒有找到答案(或者也許我沒有理解它)

+0

*「我不明白@classmethod如何調用另一個屬於同一類的方法」* - 通過'cls'訪問它。 'self'不是類方法的一部分(就像你從簽名中看到的那樣),你可以訪問* class *,而不是* instance *。 – jonrsharpe

+1

如果你沒有實例調用它,你期望'a','b'和'c'來自哪裏? – user2357112

+0

你是對的我知道。對不起,如果問題太簡單了,拼寫錯誤 –

回答

0

你改名參數爲cls,所以你必須在函數體改變selfcls也是。名稱selfcls只是常規標識符,這是一種慣例,與例如C++的this

@classmethod 
def one(cls, a, b, c): 
    d = cls.two() 
    e = cls.three() 
    cos(2*d+3*e) 

工作方式相同

@classmethod 
def one(we_need_more_unicorns, a, b, c): 
    d = we_need_more_unicorns.two() 
    e = we_need_more_unicorns.three() 
    cos(2*d+3*e) 

或者更合理的IDENTIFER像Cls(以大寫C到表示它是一個類),其有時看到了。