使用 self 与 class 名称调用静态方法

Calling a static method with self vs. class name

使用 class 名称调用 Python 静态方法更为常见,但对于较长的 class 名称可能会让人眼花缭乱。有时我在同一个 class 中使用 self 来调用静态方法,因为我发现它看起来更干净。

class ASomewhatLongButDescriptiveClassName:

   def __init__(self):
      # This works, but it's an eyesore
      ASomewhatLongButDescriptiveClassName.do_something_static()

      # This works too and looks cleaner.
      self.do_something_static()

   @staticmethod
   def do_something_static():
      print('Static method called.')

我的理解是,使用 self 调用静态方法会被解释为 ClassName.static_method(self),其中 self 会被静态方法忽略。
(编辑:以上声明仅适用于实例方法,不适用于静态方法)

为什么我不应该使用 self 在同一个 class 中调用静态方法有什么具体原因吗?

FWIW This is a sister question to , which deals with non-static methods.

您的一些陈述并不完全正确:

Calling Python static methods using the class name is more common

这并不常见,这是从 class 外部进行此操作的唯一方法。即:

class MyClass:
    @staticmethod
    def a_method():
        pass


MyClass.a_method()

在此示例中,self.a_method() 将不起作用,因为 self 不会引用 MyClass.

的实例

calling a static method with self is the same as ClassName.static_method(self), where self would be ignored by the static method

实际情况并非如此,例如:

class MyClass:
    @staticmethod
    def a_method():
        pass

    def another_method(self):
        # this is fine
        self.a_method()
        # this causes an error, as .a_method expects no arguments
        MyClass.a_method(self)

self 只是指调用实例方法的 class 的实例(它有 self 参数,甚至不必调用 self - 这就是第一个参数的名称,self 是惯例。

您可以在self 上调用静态方法,因为self 是具有静态方法的class 的实例,因此具有该方法。您还可以直接在 classes 上调用静态方法,因为静态方法不需要对象实例作为第一个参数 - 这就是静态方法的要点。

你可以在你喜欢的地方使用 self.a_method(),请记住 self 将引用 class 对象实例化的对象,而不是具体的对象class你提到。

例如:

class ClassA:
    @staticmethod
    def a_method():
        print('a')

    def another_method(self):
        # prints whatever a_method for the class of self prints
        self.a_method()
        # always prints 'a', as a_method for ClassA prints 'a'
        ClassA.a_method()


class ClassB(ClassA):
    @staticmethod
    def a_method():
        print('b')


a = ClassA()
a.another_method()
b = ClassB()
b.another_method()

输出:

a
a
b
a

所以,你看,从 self. 调用和从 Class.

调用是有区别的