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()

 工廠模式的一個方法
class
method可以用來為一個類創建一些預處理的實例.
類方法只能找類變量,不能訪問實例變量,
所以這里的name是jerry而不是實例化的tom

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM