十、静态属性、类方法、静态方法

一、静态属性@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:既不能访问类属性,也不能访问实例属性

原文地址:https://www.cnblogs.com/haoy/p/10530099.html