我越来越熟悉静态方法和类方法,我知道每个方法之间的区别。但是今天我遇到了一个问题,我想在方法中引用self
和 cls
。
我知道如何实现这一目标的唯一方法是制作一个普通的类方法(不是使用@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
装饰器?
答案 0 :(得分:3)
只需在self
上调用静态方法:
def ask(self, message: str) -> str:
return self.clean_output(self._ser.query(message))
也有。
类上的属性也总是在实例上可用(前提是实例本身没有属性,屏蔽它的名称相同)。方法(无论是常规方法,静态方法还是类方法)也不例外,它们也只是属性。他们的约束行为在这里并不重要。