python类中的所有方法都像static一样

问题描述 投票:1回答:1

就在最近,我注意到了一个新概念: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 python-3.x
1个回答
0
投票

这是因为默认情况下python 3类中的所有函数都具有静态行为 。 Python 3删除了未绑定方法的概念。正如您所做的那样,可以使用类对象本身调用类的所有成员方法。

因此,除了您的代码之外,此代码也是允许的:

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

A.func(123)

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.