静态属性+类方法

之前学过一个技巧叫装饰器,有一个类提供的方法叫property,他可以封装你写的逻辑,然后让用户调用的时候完全感知不到在调用后端的什么逻辑

class Shuichi:
    def __init__(self,chang,kuan,gao):
        self.chang = chang
        self.kuan = kuan
        self.gao = gao
    @property
    def cal_tiji(self):
        return self.chang * self.kuan * self.gao
p1 = Shuichi(2,3,4)
print(p1.cal_tiji)

类在调用自己的函数属性时,跟实例捆绑到一块了,但是如果只想z执行类的方法,就是不跟任何势力捆绑,只跟类捆绑的方法,叫做类方法
使用@classmethod放在函数开头的位置,他就会变成一个专门供类使用的方法
还有一个东西是@staticmethod,这个东西叫做类的工具包,他既不和实例绑定到一起,也不和类绑定在一起
staticmethod静态方法只是名义上的归属类管理,不能使用类变量和实例变量,是类的工具包

    @staticmethod#类的工具包
    def xizao(a,b,c):
        print('%s %s %s洗澡呢'%(a,b,c))
Dog.xizao('lele','yibole','qwe')
#同样在类的属性字典中存在
print(Dog.__dict__)
#如果是p1.__dict__中则不存在

总结:
静态属性:@property把函数封装成为数据属性,在外部在调用时不知道内部逻辑
类方法:@classmethod把函数中传参的self变成cls,除了不能访问实例的属性其他都可以
静态方法:@staticmethod参数不为self也不为cls,不能访问类属性也不能访问实力属性

class Cat:
    egg = 2
    def __init__(self,name,age):
        self.name = name
        self.age = age

    @property
    def jueyu(self):
        print('%s在%s时候做了绝育'%(self.name,self.age))

    @classmethod
    def long_ago(cls,name):
        print('%s之前可是有%s个蛋蛋der'%(name,cls.egg))

    @staticmethod
    def taijian(name):
        print('然后%s现在是一个太监'%name)

p1 = Cat('lazyegg','1岁')
p1.jueyu
Cat.long_ago('landan')
Cat.taijian('lazyball')
print(p1.__dict__)
p1.long_ago('bate')#传入时必须得填写name,因为不能使用实例中的name
p1.taijian('bate')#传入时必须得填写name,因为不能使用实例中的name
#p1.jueyu('bate','1岁')#报错,因为已经有了实例中的参数了
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章