就在最近,我注意到了一个新概念: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行,in A.fun()TypeError:非绑定方法fun()必须使用A实例作为第一个参数调用(没有取而代之)
python3输出:
开玩笑 FUN2
并且,在python3中,它似乎被称为类函数,它不再是一个方法。
所以,我的问题是:为什么这会改变?因为我们已经可以使用@staticmethod
在类中定义一些效用函数。
这是因为默认情况下python 3类中的所有函数都具有静态行为 。 Python 3删除了未绑定方法的概念。正如您所做的那样,可以使用类对象本身调用类的所有成员方法。
因此,除了您的代码之外,此代码也是允许的:
class A:
def func(self):
print('Hello')
A.func(123)
这可能是为了方便起见,使您不必在某些情况下编写@staticmethod
,并且还允许您将实例方法与其他类型的对象一起使用,如上面的代码片段所示。
该函数未显示为静态方法,因为它不是。正如@ Aran-Fey指出的那样,仍然可以在类的实例上调用无参数静态方法,这就是我们在Python 3中使用@staticmethod
的原因。
(请查看旧答案,错误版本的此答案的编辑历史记录)