【问题标题】:Calling static method using class name - Good or Bad?使用类名调用静态方法 - 好还是坏?
【发布时间】:2017-07-30 16:43:51
【问题描述】:

我越来越熟悉静态方法和类方法,我知道它们之间的区别。但是我今天遇到了一个问题,我想在一个方法中同时引用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

这个例子是哲学的过度简化版本。我想对从串行设备返回的数据调用 clean 或 parse 函数。有没有办法像这样实现 ask 方法?:

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

或者我可以像这样明确地用myClass 调用它吗?如果是,程序员什么时候应该使用@classmethod,什么时候可以使用类名本身?是否仅在您期望发生子类化时才真正需要使用 @classmethod 装饰器?

【问题讨论】:

    标签: python python-3.x class static-methods class-method


    【解决方案1】:

    只需调用self上的静态方法即可:

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

    那里也有。

    类的属性在实例上也总是可用的(假设实例本身没有具有相同名称的属性来掩盖它)。方法(无论是常规方法、静态方法还是类方法)也不例外,它们也只是属性。它们的绑定行为在这里无关紧要。

    【讨论】:

    • 啊天啊...这太简单了。不过谢谢你。这些信息是否在任何地方发布?我看了看,但也许我没有问谷歌正确的问题。实例也将具有类方法是完全有道理的。哇!
    • @boymeetscode:我已经添加了它们可用的原因; staticmethod 对象在这里并不特殊,因此不会有任何专门的文档指向那里。 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-27
    • 1970-01-01
    • 1970-01-01
    • 2011-12-25
    • 2011-02-01
    • 2011-12-06
    • 2012-09-11
    相关资源
    最近更新 更多