类方法和静态方法

一、类属性和对象属性

从字面上其实也可以理解,类属性是在类中定义的属性,属于类,对象属性是创建实例初始化的属性,属于对象实例。

class Student:
	name="z7sz"  #类属性
	
	def __init__(self,name):
		self.name=name  #对象属性
        
s1=Student('blog')
print(s1.name)  #结果为blog,访问的是对象属性
print(Student.name)   #结果为z7sz,访问的是类属性

访问类属性通过类名.属性名来访问。类属性和对象属性还是很容易理解的,这两种的访问方式也不同,在某些特殊时候,类属性可以通过对象来访问,比如该对象中没有该属性时,访问对象名.属性名则可以访问到类属性,但是最好不要这么做,因为这么做容易导致类属性和对象属性两者混乱。

二、类方法和静态方法

之前我们在类中定义的方法都是属于对象方法,换句话说就是这些方法都是跟对象相关的方法,是对象使用的到的方法。除此之外,类中还可以存在类方法和静态方法,这两类方法是属于类的,也就是说这两种方法不是对象该有的方法。

类方法用@classmethod装饰器修饰,并且第一个参数是cls,代表类本身;一般使用类名.方法名调用,不建议使用对象名.方法名调用;没有self,不可以使用类中其他对象的属性和方法;可以调用类方法、类属性和静态方法,通过cls调用。

静态方法通过@staticmethod 装饰器修饰;静态方法的写法跟写普通函数一样;一般使用类名.方法名调用,不建议使用对象名.方法名调用;既没有self也没有cls,因此不可以使用类中其他对象的属性和方法;形式参数中没有cls,不建议使用类属性\类方法\静态方法;静态方法是一个单独的方法,我们在定义类的时候,有时候部分函数跟类没关系,但是我们又需要用到它,我们可以在类外面单独定义这个函数,但是这样子的话会使代码变得难理解,因此使用静态方法,把这个单独的函数搬到类中表示。

class Student:
	def __init__(self,name):
		self.name=name
		print(type(self.name))
	
	@classmethod
	def if_str(cls,name):
		if not isinstance(name,str):
			name=str(name) 
		return cls(name)  #处理完后返回类的实例对象
		
s1=Student('z7sz')
s2=Student.if_str(111)  #显示为str类型

像上面的代码,写了一个函数用来判断传入的参数值是否为字符串,这个函数跟s1这个对象是没有啥关系的,实际上也可以在类外部定义函数并进行判断。

class Student_s:
	def __init__(self,name):
		self.name=name
		Student.if_str(self.name)
	@staticmethod
	def if_str(name):
		if not isinstance(name,str):
			raise ValueError('name must be an str!')

s3=Student_s('zsz')
s4=Student_s(111) #会显示错误

静态方法和类方法二者并没有本质区别,静态方法通常是一个独立的函数,并没有和特定的对象绑定。

由于Python类中只能有一个初始化方法,不能按照不同的情况初始化类,所以类方法可以用来自定义初始化,比如上面的类方法样例,当然静态方法也可以,但是静态方法由于没有形参,所以每次都要写上类的名字,类名一改静态方法就会发生错误,所以静态方法更适合于用来定义跟类没有任何关系的函数,而类方法则可以用来自定义初始化。
我的博客:https://blog.z7sz.top

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xingyuzhongxuan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值