python黑魔法之 “@classmethod” decorator

最近看了很多关于python内置函数的资料,看到关于classmethod的时候,有点混乱,而且看了别人的分析也有点不太清晰,然后自己写了例子分析了一下,以下就是自己的理解,以及为啥要用这个东西。

class base:
    tasks = []

    # def add_task(self, name):
    #     base.tasks.append(name)

    @classmethod
    def add_task(cls, name):
        cls.tasks.append(name)
        print(type(cls) == type(base))
        print(id(cls) == id(base))

首先我自己定义了一个类base,在里面定义了一个类属性tasks,其中注释是我用另外一种写法实现对类属性的共享,下面在classmethod里面得到了cls和base其实是一样的验证。

base1 = base()
base2 = base()

base1.add_task('cat')
base2.add_task('dog')
print('base.tasks={},base1.tasks={},base2.tasks={}'.format(base.tasks, base1.tasks, base2.tasks))

其结果如下:

Python 3.8.1 (default, Jan  8 2020, 15:55:49) [MSC v.1916 64 bit (AMD64)] on win32
runfile('E:/pycharmlocation/PYGAME/pandas_tutorial/class_tutorial.py', wdir='E:/pycharmlocation/PYGAME/pandas_tutorial')
True
True
True
True
base.tasks=['cat', 'dog'],base1.tasks=['cat', 'dog'],base2.tasks=['cat', 'dog']

从上面的结果可以发现,我们实际是用该类的对象的操作去改变了该类的属性,这也佐证有的人举的例子,班级和学生。这个例子是这样的:班级是个类(就像这里面的base),他有个属性该班的人数(num),然后有个方法使得每生成一个学生,就使得这个班的类属性num加1,最后可以返回这个类的人数。

你可能感兴趣的:(python)