调用静态方法的惯用方式

Idiomatic way of calling a static method

在 class 中从 调用静态方法的 pythonic 方法是什么?

class SomeClass:
    @staticmethod
    def do_something(x: int) -> int:
        return 2*x + 17

    def foo(self) -> None:
        print(self.do_something(52))      # <--- this one?
        print(SomeClass.do_something(52)) # <--- or that one?

     class SomeClass:
       @staticmethod
       def do_something(x: int) -> int:
         return 2*x + 17

       def foo(self) -> None:
          print(SomeClass.do_something(52)) # <--- or that one?

我认为使用

调用 staticmethod 是 pythonic
SomeClass.do_something(52)

来源:

It can be called either on the class (e.g. C.f()) or on an instance (e.g. C().f()); the instance is ignored except for its class.

即使在实例上调用它,它仍然只会从中推断出 class 并执行函数

x = 123
x.__class__
<class 'int'>

这完全取决于您的用例,因为在子类化的上下文中,这两种方法做不同的事情。考虑以下因素:

class OtherClass(SomeClass):
    @staticmethod
    def do_something(x: int) -> int:
        return 42

OtherClass().foo()

这将打印 42121 因为 self.do_something(52) 使用 method resolution orderSomeClass.do_something(52) 总是引用相同的方法(除非名称 SomeClass 绑定到不同的对象)。