@property @calssmethod @staticmethod

靜態(tài)屬性 == 數(shù)據(jù)屬性
若想方便使用想將類的函數(shù)屬性同對象的數(shù)據(jù)屬性一樣可供對象直接調用,可以在類中的函數(shù)前加上裝飾器@property,這樣就將函數(shù)屬性
轉換為類似數(shù)據(jù)屬性一樣可供直接調用(封裝)
但是不可被修該(不同于數(shù)據(jù)屬性),靜態(tài)屬性可以訪問類的數(shù)據(jù)屬性和實例的數(shù)據(jù)屬性

如果不想通過實例來調用類的函數(shù)屬性,而直接用類調用函數(shù)方法,則這就是類方法,通過內置裝飾器@calssmethod
  類名.類方法()
  類方法只是給類使用(無論是否存在實例),只能訪問實例屬性(變量)

@staticmethod 靜態(tài)方法只是名義上歸屬類管理,但是不能使用類變量和實例變量,是類的工具包
放在函數(shù)前(該函數(shù)不傳入self或者cls),所以不能訪問類屬性和實例屬性

class cal:
    cal_name = '計算器'
    def __init__(self,x,y):
        self.x = x
        self.y = y

    @property           #在cal_add函數(shù)前加上@property,使得該函數(shù)可直接調用,封裝起來
    def cal_add(self):
        return self.x + self.y

    @classmethod        #在cal_info函數(shù)前加上@classmethon,則該函數(shù)變?yōu)轭惙椒?,該函?shù)只能訪問到類的數(shù)據(jù)屬性,不能獲取實例的數(shù)據(jù)屬性
    def cal_info(cls):  #python自動傳入位置參數(shù)cls就是類本身
        print('這是一個%s'%cls.cal_name)   #cls.cal_name調用類自己的數(shù)據(jù)屬性

    @staticmethod       #靜態(tài)方法 類或實例均可調用
    def cal_test(a,b,c): #改靜態(tài)方法函數(shù)里不傳入self 或 cls
        print(a,b,c)

c = cal(10,11)
print(c.cal_name)   #>>> '計算器'   調用類的數(shù)據(jù)屬性
print(c.cal_add)    #>>> 21         這樣調用類函數(shù)屬性看起來跟調用數(shù)據(jù)屬性一樣  c.cal_name >>> '計算器'
c.cal_add = 10      #這樣修改會報錯,因為不可被修改

cal.cal_info()   #>>> '這是一個計算器'
#可以看出上述類并沒有實例化,可以通過類直接調用類函數(shù)。
當然類方法,實例也可以調用,但是并沒有什么用,違反了初衷:類方法就是專門供類使用

c1 = cal(10,11)
cal.cal_test(1,2,3)     #>>> 1 2 3
c1.cal_test(1,2,3)      #>>> 1 2 3
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容