蟒蛇如何从类主体的内部调用静态方法
问题描述:
假设我有一个类,它有一个静态方法,我想一个类属性被设置为值,这个方法返回:蟒蛇如何从类主体的内部调用静态方法
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()
但EXA mple如果我写:
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
有没有一种方法调用类内的静态方法,同时宣布呢? 为什么代码的第一和第三个例子不起作用,但第二个例子呢? python解释器如何处理这种声明?
答
staticmethod
是描述符。描述符公开了__get__(instance, cls)
方法,允许通过实例或者在类级别访问它。
现在在你的情况下,你想打电话给它在一节课节。通常情况下这是不可能的,因为实例和类都不可用。然而staticmethod
在任何情况下都会忽略,所以你可以使用下面相当讨厌的方法来调用它。
class A:
@staticmethod
def foo():
return 12
baz = foo.__get__(None, object)()
然后
>>> A.baz
12
注:传递object
作为第二个参数是staticmethod
坚持传递的一类某种作为第二个参数的唯一原因。
答
这也是一种解决方法,但它可能有所帮助。
在class
正文中,您不能引用正在创建的类。 OTOH类装饰器接收一个初始化类,因此它可以直接调用它的方法。
def add_baz(cls):
cls.baz = cls.foo()
return cls
@add_baz
class A:
@staticmethod
def foo():
return 12