上一篇,我们讲到Python类中的属性是有区别的,爱思考的小伙伴们可能就会问了,Python中的方法是不是也有区别呢?是的,而且Python中的方法区别更大,让我们来看看吧~

Python类中的三种方法

Python中的方法可以分为三类:

实例方法:第一个参数是实例对象 self,必须通过实例去调用。

类方法:需要在方法前加 @classmethod 修饰,第一个参数是类本身,一般写作cls,类和实例都可以调用。

静态方法:需要在方法前加 @staticmethod修饰,没有隐含传递的参数:方法体中不能使用类或实例的任何属性和方法

这里的@classmethod 和 @staticmethod 都是函数装饰器(Decorators),简单来说它是一个修改其它函数的功能的函数。具体的细节涉及到Python更深层的东西。在这里我们只需要了解只要它俩出现,那么这个方法就是类方法或者静态方法。

看过上一篇的小伙伴们应该都知道self是什么了,在这里简单再说一下,我们可以使用self指代的是当前的实例,相当于每个实例的钥匙,根据self,每个实例只能调用自己的变量和方法。

是不是看完还是觉得有点绕呢~为了更清楚地了解这三个方法的差异,我们还是拿例子来进行讲解

python 类还是函数 python函数和类的区别_python函数和类的区别

在这个例子里面,我们定义了一个类Student,小伙伴们应该会发现,我们在Student类里定义了一个类属性grade和两个实例属性age和height。然后我们分别定义了三个方法,根据刚开始我们给的三种方法的介绍,小伙伴们能不能看出这三个方法分别属于哪一种呢?

这个不难~

print_age方法是一个实例方法,它的第一个参数是self,前面没有任何的修饰。

print_grade方法是一个类方法,他的第一个参数是cls,前面使用@classmethod修饰。

Print_info方法是一个静态方法,他没有任何的参数,前面使用@staticmethod修饰

我们在定义完Student类后,我们分别使用类Student和实例tom去调用这三个方法,看看会发生什么~

python 类还是函数 python函数和类的区别_Python_02

大家观察代码第15-22行可以看到,当我们使用类Student调用print_age方法时,它会报错,显示缺少一个参数self。这是因为这里不是这时还没有类的实例,而且方法中的self.age属性也不存在,这时候是不能调用实例方法的。而我们使用类Student调用print_grade方法就没有问题,因为我们已经声明这是个类方法,而且grade这个属性在类中已经定义好了。同样,因为我们已经声明print_info是静态方法,所以调用也是没有问题的。

我们也根据Student类生成了一个实例tom,然后我们使用实例tom去调用这三个方法,看看会发生什么~

python 类还是函数 python函数和类的区别_python 类还是函数_03

如上面的代码所示,三个方法都正确的输出了结果,表明这三种方法都可以被类的实例调用。

我也给小伙伴们制作了一个简单的表格,方便大家查询。

python 类还是函数 python函数和类的区别_类方法_04

实际使用中如何选择三种方法

那么说了这么多,比较了这三种方法的差异,那么为什么会有这三种方法的区别呢?因为他们对于不同属性的调用有所区别,可被调用的对象不同,所以在实际使用中就是根据这些差异来选择最合适的方法。

实例方法是类中最普遍的方法,我们通常定义的都是实例方法,不需要多说了。

关于类方法,如果说我现在要定义一个方法,这个方法只需要调用类属性,也只在把类当作一个对象使用的时候才会需要这个方法,或者说在逻辑上采用类本身作为对象来调用更合理,这时候就应该使用类方法。

关于静态方法,我们可以发现它不需要任何的参数,不会涉及到类中的属性和方法的操作。本质上说它只是在逻辑上逻辑上属于类,但是和类本身没有关系,在碰到这种情况时可以定义静态方法。

结束语

在Python的类中,不同的方法有不同的应用范围,根据自己的实际需求,选择合适的方法,才能发挥每个方法最大的用处。小伙伴们快快试起来吧~