python类中的所有方法都表现为静态

时间:2019-03-15 08:27:28

标签: python python-3.x

最近,我注意到一个新概念: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定义一些实用程序函数。

1 个答案:

答案 0 :(得分:0)

这是因为python 3类中的所有函数默认都具有静态行为。 Python 3放弃了 unbound 方法的概念。您可以使用类对象本身来调用类的所有成员方法。

因此,除了您的代码外,该代码也被允许:

class A:
    def func(self):
        print('Hello')

A.func(123)

这样做可能是为了方便起见,在某些情况下,您不必编写@staticmethod,也可以使实例方法与其他类型的对象一起重用,如上面的代码片段所示。

该函数未显示为静态方法,因为它不是。正如@ Aran-Fey指出的那样,仍然可以在类的实例上调用无参数静态方法 ,这就是为什么我们在Python 3中拥有@staticmethod的原因。

(请检查此答案的旧版本,错误版本的编辑历史记录)