2017-03-09 54 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对象在这里并不特别,所以不会有任何专门的文档指向那里。 :-) –