python三大裝飾器
- @staticmethod(靜態方法)、@classmethod(類方法)、@property(描述符)
@classmethod、@staticmethod
class Dog:
dogbook = {'黃色':30, '黑色':20, '白色':10} #類變量
def __init__(self, name, color, weight): #類屬性
self.name = name
self.color = color
self.weight = weight
#實例方法:定義時,必須把self作爲第一個參數,可以訪問實例變量,只能通過實例名訪問
def bark(self):
print(f'{self.name} 叫了起來')
#類方法:定義時,必須把類作爲第一個參數,可以訪問類變量,可以通過實例名或類名訪問
@classmethod
def dog_num(cls):
num = 0
for v in cls.dogbook.values():
num = num + v
return num
#靜態方法:不強制傳入self或者cls,它對類和實例一無所知。不能訪問類變量,也不能訪問實例變量,可以通過實例名或類名訪問
@staticmethod
def total_weights(dogs):
total = 0
for o in dogs:
total = total + o.weight
return total
print(f'共有{Dog.dog_num()} 條狗')
d1 = Dog('大黃', '黃色', 10)
d1.bark()
print(f'共有{d1.dog_num()} 條狗') #classmethod 可以訪問全局變量
d2 = Dog('旺財', '黑色', 8)
d2.bark()
print(f'狗共重{Dog.total_weights([d1,d2])} 公斤') #staticmethod和對於類和實例一無所知,依然把他放在類裏面,完全是因爲它的邏輯和 類有關聯,讓代碼看起來更加的整潔
@property應用
一、@property的應用,其功能1是可定義只讀屬性
舉例:
class Person(object):
def __init__(self, name, age=18):
self.name = name
self._age = age
@property
def age(self):
return self._age
xm = Person('xiaoming')
print(xm.age)
#輸出結果是 18
xm.age = 8
print(xm.age)
#結果報錯,說明不能夠賦值,因爲它是隻讀屬性
- 在python中定義只讀屬性非@property莫屬,如果細心留意大部分源碼,都跑不了@property的身影。而定義只讀屬性也很簡單:以需要定義的屬性爲方法名(上例age屬性定義爲方法),其上裝飾內置裝飾器@property就ok了。
二、@property真正強大的是可以限制屬性的定義。
舉例:
class Person(object):
def __init__(self, name, age):
self.name = name
self.__age = 18
@property
def age(self):
return self.__age
@age.setter
def age(self, age):
if age < 18:
print('年齡必須大於18歲')
return
self.__age = age
return self.__age
xm = Person('xiaoming', 20)
print(xm.age)
xm.age = 20
print(xm.age)
xm.age = 15
print(xm.age)
- 這就是@property定義可訪問屬性的語法,即仍舊以屬性名爲方法名,並在方法名上增加@屬性.setter就行了