python中的@property


使用@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()

 


免責聲明!

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



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