python类中静态方法,实例方法,类方法的用法与区别

1. 实例方法

class Student():
	def __init__(self,name):
		self.name = name
		
	def print_name(self):
		print(self.name)
		
 student1 = Student('xujin')

在上述例子中,print_name就是一个实例方法,只能通过实例化过的具体对象来调用这个方法。
在这里插入图片描述
而不能直接通过类来调用这个方法,会提示我们缺少一个self的参数
在这里插入图片描述
这是因为我们在使用具体的实例化对象调用实例方法时,python会默认将实例化对象本身作为这个函数的第一个参数传入函数中,也就是self变量就会接收这个传入进来的实例化对象,而当我们使用类来调用这个方法时,python并不能将类本身传入这个函数方法中。所以就会报一个缺少参数的错误。

我们使用代码来证明上面的说法,看一下这个self是不是我们实例化的student1这个对象,修改一下上面的print_name这个方法

class Student():
    def __init__(self,name):
        self.name = name
        
    def print_name(self):
        print(id(self))
        print(self.name)
        
student1 = Student('xujin')

在这里插入图片描述
我们可以看slefstudent1两个对象的地址是一样的,这就证实了我们上面的说法。

如果我们就是想用类来调用实例方法,也是有方法的,再上面我们已经说到了,实例方法第一个参数self就是就是接收的实例化对象,通过实例对象调用实例方法时,python将实例化对象作为第一个参数传入了这个方法中,而我们用类调用实例方法时就缺少了一个参数,所以我们可以显示的传入这个对象,也就不会报缺少参数的错误了,也能够使用类来调用实例方法了。
在这里插入图片描述
这个方法我们只是了解就可以了,在实际的生产过程中,我们都不会这么使用的,直接使用对象调用实例方法就可以,而不用这么麻烦。

类方法

上面我们说到的方法只能是通过实例化对象来调用,那么直接使用类来调用的方法应该怎样来定义呢?

class Student():
    def __init__(self,name):
        self.name = name
        
    def print_name(self):
        print(self.name)
        
    @classmethod
    def class_method(cls):
    	print(id(cls))
        print('class method called')

上面类中的class_method方法就是一个类方法,也就是由@classmethod装饰器装饰的方法就是类方法。类方法的第一个参数为cls(变量名字可以随便改,但是必须为第一个参数,只是一般我们都习惯使用cls命名),当我们使用类调用类方法时,python就会将当前的类作为第一个参数传入进这个方法。我们也使用上面的方法来证明一下。
在这里插入图片描述
这样也验证了我们上面的说法是正确的。

那么我们可不可以通过实例化对象来调用类方法呢?
在这里插入图片描述
从上面代码看出,答案是可以的,实例化对象调用类方法,传入的第一个参数还是当前的类。

静态方法

静态方法在python使用@staticmethod方法定义,首先我么先看一个例子。

定义一个三角形的类:

class Triangle():
    def __init__(self,a,b,c):
        self.a = a
        self.b = b
        self.c = c
    
    # 得到三角形的周长
    def get_perimter(self):
        return self.a + self.b + self.c

而当我们实例化对象的时候,我们又想到,任意给定的三条边不一定能构成三角形,三角形的三条边是需要满足一定的条件才可以构成三角形的。

这个时候我们可能想到单独定义一个函数来判断是否能构成三角形。

def is_valid(a,b,c):
	return a+b>c and a+c>b and b+c>a

但是这个方法明显和三角形这个有关联的。如果不定义在类里面就感觉不合适。但是它又不属于类方法和实例方法中的任何一种,因为我们进行判断的时候还没有这个对象的存在。这个时候我们就需要用到我们的静态方法了。

修改上面的类为:

class Triangle():
    def __init__(self,a,b,c):
        self.a = a
        self.b = b
        self.c = c
    
    # 得到三角形的周长
    def get_perimter(self):
        return self.a + self.b + self.c
    
    @staticmethod
    def is_valid(a,b,c):
        return a+b>c and a+c>b and b+c>a

这样我们就将这个方法放在 Triangle这个类中了。然后我们就可以像下面这样来使用这个方法来判断能否构成三角形了。
在这里插入图片描述
那么静态方法可不可以通过实例化对象来调用呢?
在这里插入图片描述
答案是可以的。但是我们一般都不会这样使用。

那么静态方法与类方法和实例方法相比有什么不同呢:
静态方法不会自动传入第一个参数。而实例方法和类方法都会自动传入第一个参数。

总结:

  1. 实例方法:调用时会自动传入一个实例化对象作为第一个参数。只有实例对象可以调用。类直接调用需要显示传入实例对象,不推介使用
  2. 类方法:调用使用会自动传入当前类作为第一个参数,实例化对象和类都可以直接使用。定义时需要使用@classmethod装饰器装饰
  3. 静态方法:和正常函数一样工作,但是属于类的命名空间,无权访问selfcls。定义时需要使用@staticmethod装饰器装饰。实例化对象和类都可以直接使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值