使用@property裝飾器的好處是既可以保護類的封裝性,又可以使用“類.屬性”來對私有屬性進行操作。
使用@property裝飾器可以直接通過方法名來訪問方法,不需要再在后面使用"()".
class pandas(object): def __init__(self,age): self.__age=age def __str__(self): return("panda's age:"+str(self.__age)) @property #直接通過方法名訪問age方法,但是這只能對age讀操作 def age(self): return(self.__age) @age.setter #可以直接通過該方法對類中的私有變量的值進行修改 def age(self,value): self.__age=value @age.deleter #可以直接通過該方法直接刪除私有變量的值 def age(self): self.__age=0 p=pandas(3) print(p.age) #直接通過方法名訪問age方法,但是這只能對age讀操作 print(p) p.age=4 print(p) del p.age print(p)
上面的例子分別展示了:
- 使用@property 直接調用 age() 方法,這樣就使得該方法變成了 age 屬性的 getter 方法,也就是讀操作
- setter 裝飾器:@age.setter,可以對私有屬性age的值進行寫操作
- deleter 裝飾器: @age.deleter,可以對私有屬性age的值進行刪除操作
注1:另外,私有屬性只能在類中使用,且不可訪問,目的是保護數據的安全性,以及隱藏核心開發細節。私有屬性或私有方法以兩個下划線開頭。
注2:面向對象有三大特性: 封裝,繼承,多態
- 父類的私有方法和私有屬性,不會被子類繼承
- 可以通過調用繼承的父類的共有方法,間接的訪問父類的私有方法、屬性
- python中用super來使子類繼承父類的屬性或方法
class animal(object): def __init__(self,name,age): self.name=name self.age=age def __str__(self): #當print(類)時,自動返回該模塊 return("name:"+str(self.name)+",age:"+str(self.age)) def climb(self): print(str(self.name)+" can climb the tree.") def eat(self): print(str(self.name)+" eats three times a day.") class panda(animal): def __init__(self,name,age):#創建類之后,自動調用該模塊對類中的屬性進行初始化 super(panda,self).__init__(name,age) def climb(self): #重寫父類的climb方法 print(str(self.name)+" can climb the tree rapidly.") #若父類的name屬性是私有屬性,這里就無法訪問
if __name__=="__main__": p=animal("Mary",2) print(p) p.climb() p1=panda("Mary",3) print(p1) p1.eat() p1.climb()