靜態屬性+類方法

之前學過一個技巧叫裝飾器,有一個類提供的方法叫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歲')#報錯,因爲已經有了實例中的參數了
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章