靜態(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