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

python how to call static method from inside of a class body

本问题已经有最佳答案,请猛点这里访问。

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

1
2
3
4
5
6
class A:
    @staticmethod
    def foo():
        return 12

     baz = foo()

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

1
2
3
4
Traceback (most recent call last):
  File"<stdin>", line 1, in <module>
  File"<stdin>", line 5, in A
TypeError: 'staticmethod' object is not callable

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

1
2
3
4
5
6
class A:
    class B:
        @staticmethod
        def foo():
            return 2
baz = B.foo()

但例如,如果我写:

1
2
3
4
5
6
7
8
class A:
    class B:
        @staticmethod
        def foo():
            return 2

    class C:
        baz = B.foo()

我还得到一个错误:

1
2
3
4
5
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

有没有一种方法可以在声明静态方法时从类内部调用它?为什么第一个和第三个代码示例不起作用,而第二个则起作用?Python解释器如何处理此类声明?


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

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

1
2
3
4
5
6
class A:
    @staticmethod
    def foo():
        return 12

    baz = foo.__get__(None, object)()

然后

1
2
>>> A.baz
12

注:将object作为第二个论点通过的唯一原因是staticmethod坚持将某一类作为第二个论点通过。


这也是一个解决方法,但可能会有所帮助。

class主体中,不能引用正在创建的类。类修饰器接收初始化的类,因此它可以直接调用其方法。

1
2
3
4
5
6
7
8
9
def add_baz(cls):
    cls.baz = cls.foo()
    return cls

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