python如何从类体内部调用静态方法

arr*_*nee 3 python static-methods class subclass class-method

假设我有一个带有静态方法的类,并且我希望将类属性设置为该方法返回的值:

class A:
    @staticmethod
    def foo():
        return 12

     baz = foo()
Run Code Online (Sandbox Code Playgroud)

但是这样做我得到一个错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 5, in A
TypeError: 'staticmethod' object is not callable
Run Code Online (Sandbox Code Playgroud)

我找到了解决这个问题的方法:

class A:
    class B:
        @staticmethod
        def foo():
            return 2
baz = B.foo()
Run Code Online (Sandbox Code Playgroud)

但例如,如果我写:

class A:
    class B:
        @staticmethod
        def foo():
            return 2

    class C:
        baz = B.foo()
Run Code Online (Sandbox Code Playgroud)

我也收到一个错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 6, in A
  File "<stdin>", line 7, in C
NameError: name 'B' is not defined
Run Code Online (Sandbox Code Playgroud)

有没有办法在声明类的同时从类中调用静态方法?为什么第一个和第三个代码示例不起作用,而第二个可以?python解释器如何处理这样的声明?

don*_*mus 5

staticmethod是一个描述符。描述符公开__get__(instance, cls)方法,允许通过实例或在类级别访问它。

现在,在您的情况下,您希望在类节中调用它。通常这是不可能的,因为实例和类都不可用。但是 astaticmethod在任何情况下都会忽略两者,因此您可以使用以下相当讨厌的方法来调用它。

class A:
    @staticmethod
    def foo():
        return 12

    baz = foo.__get__(None, object)()
Run Code Online (Sandbox Code Playgroud)

然后

>>> A.baz
12
Run Code Online (Sandbox Code Playgroud)

注意:object作为第二个参数 传递的唯一原因是staticmethod坚持将某种类作为第二个参数传递。