最近,我注意到一个新概念:python3中的class function
。
(注意:不询问类方法,而是下一个代码中的类函数,例如fun
。)
class A:
def fun():
print("fun")
@staticmethod
def fun2():
print("fun2")
A.fun()
A.fun2()
# updated
print(A.__dict__)
# {'__module__': '__main__', 'fun': <function A.fun at 0x0000014C658F30D0>, 'fun2': <staticmethod object at 0x0000014C658E1C50>, '__dict__': <attribute '__dict__' of 'A' objects>, '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None}
如果执行以上代码:
python2输出:
回溯(最近一次通话最近):
中的文件“ a.py”,第9行 A.fun()TypeError:未绑定方法fun()必须以一个实例作为第一个参数来调用(取而代之的是
python3输出:
乐趣
fun2
而且,在python3中,它似乎被称为类函数,它不再是方法。
所以,我的问题是:为什么这会改变?我们已经可以在类中使用@staticmethod
定义一些实用程序函数。
答案 0 :(得分:0)
这是因为python 3类中的所有函数默认都具有静态行为。 Python 3放弃了 unbound 方法的概念。您可以使用类对象本身来调用类的所有成员方法。
因此,除了您的代码外,该代码也被允许:
class A:
def func(self):
print('Hello')
A.func(123)
这样做可能是为了方便起见,在某些情况下,您不必编写@staticmethod
,也可以使实例方法与其他类型的对象一起重用,如上面的代码片段所示。
该函数未显示为静态方法,因为它不是。正如@ Aran-Fey指出的那样,仍然可以在类的实例上调用无参数静态方法 ,这就是为什么我们在Python 3中拥有@staticmethod
的原因。
(请检查此答案的旧版本,错误版本的编辑历史记录)