一、静态属性@property
封装函数属性内部逻辑,便于影藏函数属性内部逻辑,外部调用时,以变量属性的方式调用
class Room: def __init__(self,name,owner,width,length,heigh): self.name=name self.owner=owner self.width=width self.length=length self.heigh=heigh r1=Room('房间101','alex',10,10,2) r2=Room('房间102','han',5,5,3) #需求计算房间的面积并输出 print('%s的%s面积为%s'%(r1.owner,r1.name,r1.width*r1.length)) print('%s的%s面积为%s'%(r2.owner,r2.name,r2.width*r2.length)) #若有100个实例,则此种方法重复率过高,可在类中定义一个函数 class Room: def __init__(self,name,owner,width,length,heigh): self.name=name self.owner=owner self.width=width self.length=length self.heigh=heigh def cal_area(self): print('%s的%s面积为%s'%(self.owner,self.name,self.width*self.length)) r1=Room('房间101','alex',10,10,2) r2=Room('房间102','han',5,5,3) r1.cal_area() r2.cal_area() #若需求为调用面积的调用方式与调用变量属性的方式相同,即使用r1.cal_area的格式调用 #类提供了一个静态属性装饰器@property,修饰完函数后,调用方式即为r1.cal_area class Room: def __init__(self,name,owner,width,length,heigh): self.name=name self.owner=owner self.width=width self.length=length self.heigh=heigh @property def cal_area(self): return self.width*self.length r1=Room('房间101','alex',10,10,2) r2=Room('房间102','han',5,5,3) print(r1.cal_area) print(r2.cal_area)
二、类方法@classmethod
@classmethod修饰过的函数,不与任何实例捆绑,只与类捆绑
#当需求为,不进行实例化,直接调用类方法时 class Room: def __init__(self,name): self.name=name def test(self): print('--->',self.name) Room.test(1) #类调用函数属性时不会自动加self,所以手动加,但此时并不能找到self.name即1.name #类提供了@classmethod class Room: tag=10 def __init__(self,name): self.name=name @classmethod def test(cls,x): #类cls表明是类方法 print('--->',cls.tag,x) Room.test(5) #---> 10 5 自动将Room传给cls
三、静态方法@staticmethod
@staticmethod修饰过的函数不与类绑定,也不与实例绑定
静态方法只是名义上归属类管理,不能使用类变量和实例变量,是类的工具包
class Room: tag=10 def __init__(self,name): self.name=name @staticmethod def test(a,b,c): print('--->',a,b,c) Room.test(1,2,3) #---> 1 2 3 p1=Room('alex') p1.test(1,2,3) #---> 1 2 3
四、小结
静态属性@property :将函数封装成一个数据属性形式,是外部调用无法知道内部逻辑
既可以访问类属性,也可以访问实例属性
类方法@classmethod:只能访问类属性,不能访问实例属性
静态方法@staticmethod:既不能访问类属性,也不能访问实例属性