2017-03-09 26 views
2

我越來越熟悉靜態方法和類方法,我知道它們之間的區別。但我今天遇到了一個問題,我希望在方法中引用selfcls使用類名調用靜態方法 - 好還是壞?

我知道如何做到這一點的唯一方法是使一個普通的類方法(不與@classmethod,但簡單地用def),並調用類與它的名稱明確地像這樣:

class myClass: 
    def __init__(): 
     self._ser.connect('COM5') 

    def ask(self, message: str) -> str: 
     return myClass.clean_output(self._ser.query(message)) 

    @staticmethod 
    def clean_output(dirty_string: str): 
     clean_string = dirty_string.strip().replace(chr(4)) 
     return clean_string 

這個例子是哲學的過度簡化版本。我想對我回來的數據調用一個乾淨的或解析函數,就像從串口設備那樣。有什麼辦法來實現ASK方法,像這樣?:

def ask(self, message: str) -> str: 
     return cls.clean_output(self._ser.query(message)) 

還是確定的是我與myClass明確地這樣叫呢?如果是,程序員何時應該使用@classmethod以及何時允許使用類名本身?當您期望子類化發生時,是否只使用@classmethod修飾器?

回答

3

只需撥打self靜態方法:

def ask(self, message: str) -> str: 
    return self.clean_output(self._ser.query(message)) 

它可以有太多。

類上的屬性也總是可用於實例上(前提是實例本身沒有任何屬性可以掩蓋它)。方法(無論是常規方法,靜態方法還是類方法)也不例外,它們也只是屬性。他們的約束行爲在這裏並不重要。

+0

啊geez ...太簡單了。感謝它,但。這些信息是在哪裏發佈的?我看了,但也許我沒有問谷歌正確的問題。這是完全有道理的,實例也會有類方法。衛生署! – boymeetscode

+0

@boymeetscode:我添加了他們爲什麼可用; staticmethod對象在這裏並不特別,所以不會有任何專門的文檔指向那裏。 :-) –

相關問題