(介紹了三個裝飾器)
1.靜態屬性(數據屬性)
2.類方法
3.靜態方法
class A:
name = '小明' # 類A的數據屬性
age = 2
n = 1
def __init__(self):
self.name1 = 12
def shuju(self): # a = A()==> 調用:a.shuju() 類似 a.name
print('我是類A的一個方法')
@property # 把類的函數屬性變爲數據屬性,也就是封裝成了數據屬性,在通過實例訪問時不用加括號
def shuju1(self): # a = A()==> 調用:a.shuju1 類似 a.name
print('我被裝飾成了數據方法')
return self.name,self.age
# python 調用類中的函數方法時,需要先實例化,再通過self建立與方法的連接,從而調用
# 如果只想執行類的方法,不想跟任何實例有捆綁,則可以用classmethod裝飾器
# 表示裝飾器下面的方法是專門給類用的,實例不能用哦!
@classmethod # 不用實例化,直接通過類名調用裏面的方法:A.lei() #會自動把類本身傳給cls
def lei(cls): # cls 相當於A類的自身,就像實例化之後的self
print(cls)
print('----',cls.n) # 等效於:A.n
# @property :只與實例綁定,把類的方法變爲數據屬性,
# @classmethod :只與類綁定
# @staticmethod :不跟類綁定也不跟實例綁定。靜態方法 也叫類的工具包
@staticmethod # 可以用類調用:A.wash_body("小狗","小貓","小馬"); 也可以用實例調用:aa = A(); aa.wash_body("小狗","小貓","小馬")
def wash_body(a, b, c):
print("%s %s %s 正在洗澡" %(a, b, c))
總結:
@property :只與實例綁定(所以有:self代表實例自身),把類的方法變爲數據屬性
@classmethod :只與類綁定(所以有:cls代表類自身)
@staticmethod :不跟類綁定也不跟實例綁定(所有沒有默認參數)。
靜態方法只在內存中生成一個,節省開銷,(也叫類的工具包)
普通方法每個實例對象都擁有獨立的一個,開銷較大