使用类名调用静态方法 - 好还是不好?

4
我对静态方法和类方法越来越熟悉,我知道它们之间的区别。但今天我遇到了一个问题,我想在一个方法中引用selfcls。唯一我知道如何做到这一点的方法是创建一个普通的类方法(没有使用@classmethod),然后显式地使用类名调用它:
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装饰器是必须的吗?

2个回答

4
只需在 "self" 上调用静态方法即可:
def ask(self, message: str) -> str:
    return self.clean_output(self._ser.query(message))

这也在那里可用。

类上的属性总是在实例上也可用(前提是没有同名属性掩盖了实例本身)。方法(无论是常规方法、静态方法还是类方法)也不例外,它们也只是属性。它们的绑定行为在这里并不重要。


啊,天哪...这也太简单了吧。不过还是谢谢你。这些信息有发布在任何地方吗?我找了一下,但可能没有问对谷歌的问题。实例也有类方法完全说得通。唉! - boymeetscode
@boymeetscode:我已经添加了它们为什么可用的说明;staticmethod对象在这里并不特别,因此没有专门的文档可以指向那里。 :-) - Martijn Pieters

0
如果你想在self旁边加上cls,那么self.__class__就可以做到这一点。然而,正如Martijn指出的那样,在这里并不是真正必要的。但是,如果你必须在实例方法中访问类,那么请使用self.__class__ :)

这并没有回答问题。一旦你拥有足够的声望,你就可以评论任何帖子;相反,提供不需要提问者澄清的答案。- 来自审核 - doneforaiur
你的回答可以通过提供更多支持性信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人能够确认你的回答是否正确。你可以在帮助中心找到关于如何撰写好回答的更多信息。 - Ahmad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接