python中自带的三个装饰器_python三个自带装饰器的功能与使用(@property、@staticmethod、@classmethod)...
本篇隨筆只是記錄我對這三個裝飾器的理解,可能會有不準確的地方,敬請指出。
property裝飾器
功能:通過property裝飾器控制類的屬性的綁定與獲取,一般就是給某個屬性增加一個驗證類型等功能。
能夠通過實例直接點出屬性值來,更加方便快捷,如例三中student.age:
例一:
錯誤效果:
class Student(object):
age = 20
student = Student()
print(student.age) #打印結果為20
student.age="二十" #不應該綁定為字符串的屬性
為了避免如上行為,將代碼更改為:
例二:
class Student(object):
def __init__(self):
self._age = None
def age_getter(self): #返回屬性值
return self._age
def age_setter(self, age): #設置屬性值
if isinstance(age, str) and age.isdigit(): #驗證綁定屬性的類型
age = int(age)
if isinstance(age, int):
self._age = age
else:
raise ValueError("age is illegal") #如果不能轉換類型則拋出錯誤
student=Student()
student.age_setter("5") #綁定屬性為字符串5
print(student.age_getter()) 打印結果為5,Int格式
上述代碼解決了屬性綁定類型錯誤的問題,但是不夠方便,Python自帶的property裝飾器能夠幫助修飾代碼,如下:
例三:
class Student(object):
def __init__(self):
self._age = None
@property #裝飾age函數,可以直接將age函數作為屬性,直接通過等號綁定屬性值
def age(self):
return self._age
@age.setter #通過setter設置age的屬性,函數內部寫驗證規則
def age(self,age):
if isinstance(age,int):
self._age =age
return
if isinstance(age,str) and age.isdigit():
age = int(age)
self._age = age
else:
raise ValueError("age is illegal")
@age.deleter #deleter是刪除屬性方法
def age(self):
del self._age
student =Student()
student.age = "20"
print(student.age)
# del student.age
# print(student.age)
staticmethod裝飾器
功能:將被裝飾的函數從類中分離出來,該函數不能訪問類的屬性,簡單說可以將該函數理解為一個獨立的函數,不允許使用self。
staticmethod 就是將該被裝飾的函數與該類沒有關系,該函數不能用self傳參,需要和普通函數一樣傳參。
作用:
限制名稱空間,這個函數雖然是個普通的函數,但只有這個類里能用到
代碼易讀性.靜態方法并不需要self參數
約內存.不用每個實例都實例化方法.
在類內部控制靜態方法.不然的話換一種實現方法,把函數放在在類外部
例四:
class Dog(object):
def __init__(self,name):
self.name = name
@staticmethod
def eat(name,food):
print("%s is eating %s" %(name,food))
d = Dog("tom")
d.eat("tom","包子")
#通過對象調用方法
Dog.eat("jerry","面條")
#通過類調用方法
classmethod裝飾器,類裝飾器
例五:
class Dog(object):
name="Jerry"
def __init__(self,name):
self.name = name
@classmethod
def eat(self):
print("%s is eating %s" %(self.name,"food"))
def talk(self):
print("%s is talking" % self.name)
d = Dog("Tom")
d.eat()
Dog.eat()
工廠模式的一個方法classmethod可以用來為一個類創建一些預處理的實例.
類方法只能找類變量,不能訪問實例變量,
所以這里的name是jerry而不是實例化的tom
總結
以上是生活随笔為你收集整理的python中自带的三个装饰器_python三个自带装饰器的功能与使用(@property、@staticmethod、@classmethod)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python时间模块哪个好arrow模块
- 下一篇: ps清理缓存脚本_清理垃圾脚本,让你的电