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


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

  • 相关阅读:
    递归与尾递归总结
    JAVA基础——链表结构之双端链表
    JAVA基础——链表结构之单链表
    JAVA基础——集合Iterator迭代器的实现
    JAVA基础——Date和Calendar类
    JAVA基础——Native关键字
    Java基础——从数组到集合之间关键字的区别!!!!
    JAVA基础——集合类汇总
    Web前端性能优化——提高页面加载速度
    vue 与 angular 的区别
  • 原文地址:https://www.cnblogs.com/haoy/p/10530099.html
Copyright © 2020-2023  润新知