如何从 class 体内调用静态方法?
How to call static method from inside of a class body?
假设我有一个 class 和一个静态方法,我想将 class 属性 设置为此方法 returns 的值:
class A:
@staticmethod
def foo():
return 12
baz = foo()
但是这样做我得到一个错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 5, in A
TypeError: 'staticmethod' object is not callable
我找到了解决这个问题的方法:
class A:
class B:
@staticmethod
def foo():
return 2
baz = B.foo()
但是例如如果我写:
class A:
class B:
@staticmethod
def foo():
return 2
class C:
baz = B.foo()
我也得到一个错误:
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
有没有办法在声明时从 class 中调用静态方法?
为什么第一个和第三个代码示例不起作用但第二个代码示例起作用? python 解释器如何处理此类声明?
staticmethod
是描述符。描述符公开 __get__(instance, cls)
方法,允许通过实例或在 class 级别访问它。
现在,在您的情况下,您希望在 class 节中调用它。通常这是不可能的,因为实例和 class 都还不可用。但是 staticmethod
在任何情况下都会忽略两者,因此您可以使用以下相当讨厌的方法来调用它。
class A:
@staticmethod
def foo():
return 12
baz = foo.__get__(None, object)()
然后
>>> A.baz
12
注意: 将 object
作为第二个参数传递的唯一原因是 staticmethod
坚持要传递一些 class类似于第二个参数。
这也是一种解决方法,但可能会有所帮助。
在 class
正文中,您不能引用正在创建的 class。 OTOH class 装饰器收到一个初始化的 class,因此它可以直接调用它的方法。
def add_baz(cls):
cls.baz = cls.foo()
return cls
@add_baz
class A:
@staticmethod
def foo():
return 12
假设我有一个 class 和一个静态方法,我想将 class 属性 设置为此方法 returns 的值:
class A:
@staticmethod
def foo():
return 12
baz = foo()
但是这样做我得到一个错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 5, in A
TypeError: 'staticmethod' object is not callable
我找到了解决这个问题的方法:
class A:
class B:
@staticmethod
def foo():
return 2
baz = B.foo()
但是例如如果我写:
class A:
class B:
@staticmethod
def foo():
return 2
class C:
baz = B.foo()
我也得到一个错误:
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
有没有办法在声明时从 class 中调用静态方法? 为什么第一个和第三个代码示例不起作用但第二个代码示例起作用? python 解释器如何处理此类声明?
staticmethod
是描述符。描述符公开 __get__(instance, cls)
方法,允许通过实例或在 class 级别访问它。
现在,在您的情况下,您希望在 class 节中调用它。通常这是不可能的,因为实例和 class 都还不可用。但是 staticmethod
在任何情况下都会忽略两者,因此您可以使用以下相当讨厌的方法来调用它。
class A:
@staticmethod
def foo():
return 12
baz = foo.__get__(None, object)()
然后
>>> A.baz
12
注意: 将 object
作为第二个参数传递的唯一原因是 staticmethod
坚持要传递一些 class类似于第二个参数。
这也是一种解决方法,但可能会有所帮助。
在 class
正文中,您不能引用正在创建的 class。 OTOH class 装饰器收到一个初始化的 class,因此它可以直接调用它的方法。
def add_baz(cls):
cls.baz = cls.foo()
return cls
@add_baz
class A:
@staticmethod
def foo():
return 12