python类中的所有方法的行为都像静态的

All methods in python classes behaving like static

就在最近,我注意到一个新概念:Python中的class function

(注意:不是ask class方法,而是类函数,比如下一个代码中的fun)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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__': , '__weakref__': , '__doc__': None}

如果执行上述代码:

Python 2输出:

Traceback (most recent call last): File"a.py", line 9, in
A.fun() TypeError: unbound method fun() must be called with A instance as first argument (got nothing instead)

Python 3输出:

fun
fun2

而且,在python3中,它似乎被称为类函数,不再是一个方法。

所以,我的问题是:为什么这种变化?因为我们已经可以使用@staticmethod在类中定义一些实用函数。


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

因此,除了您的代码外,还允许使用此代码:

1
2
3
4
5
class A:
    def func(self):
        print('Hello')

A.func(123)

这可能是为了方便起见,避免了在某些情况下必须编写@staticmethod,还可以让您将实例方法与其他类型的对象重用,如上面的代码片段所示。

函数没有显示为staticmethod,因为它没有。正如@aran fey指出的那样,可以对类的一个实例调用一个无参数的静态方法,这就是为什么我们在python3中有@staticmethod

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