python的類訪問控制、私有屬性


一、訪問控制私有屬性

  •  使用雙下划線開頭符屬性名,就是私有屬性
  •  私有變量的本質:類定義的時候,如果聲明一個實例變量的時候,使用雙下划線,python解釋器會將其改名; 轉換名稱為_類名_變量名的名稱,所以用原來的名字訪問不到了
class Person:
    def __init__(self,name,age=19):
        self.name = name
        self.__age = age
    
    def growup(self,i=1):
        if i > 0 and i < 150:
            self.__age += 1

p1 = Person('tom')
p1.growup(20)
print(Person.__dict__)
print(p1.__dict__)
#print(p1.__age)  # 不能訪問

    通過上面實例可以看出,外部已經訪問不到__age了,age根本就沒有定義,更是訪問不到
    通過方法來訪問
    如:
        def getage(self):
            return self.__age
        print(p1.getage())
        


1、保護變量

  • 在變量名前使用一個下划線,稱為保護變量,和普通的屬性一樣,解釋器不會做任何特殊的處理,只是個約定
class Person:
    def __init__(self,name,age=19):
        self.name = name
        self._age = age


2、私有方法本質

  •  單下划線的方法只是開發者之間的約定,解釋器不做任何改變
  •  雙下划線的方法,是私有方法,解釋器會改名,改名策略和私有變量相同
  •  方法變量都在類的__dict__中可以找到

3、屬性裝飾器

  •  property裝飾器:后面跟的函數名就是以后的屬性名,它就是getter,這個必須有,有了它至少是只讀屬性
  •  setter裝飾器:與屬性名同名,且接收2個參數,第一個是self,第二個是將要賦值的值,有了它,屬性可寫
  •  deleter裝飾器:可以控制是否刪除屬性,很少用到
  • property裝飾器必須在前,setter,deleter裝飾器在后,property裝飾器能通過簡單的方式,把對方法的操作變成對屬性的訪問,並起到了一定隱藏效果

 

    一般好的設計是:把實例的屬性保護起來,不讓外部直接訪問,外部使用getter讀取屬性和setter方法設置屬性
    class Person:
    def __init__(self,name,age=19):
        self.name = name
        self.__age = age
        
    def age(self):
        return self.__age
    
    def set_age(self,age):
        self.__age = age
    tom = Person('Tom')
    print(tom.age())
    tom.set_age(20)
    print(tom.age())  
    
    以上通過age 和set_age方法操作屬性
    
通過屬性裝飾器來實現以上代碼
        
class Person:
    def __init__(self,name,age=19):
        self.name = name
        self.__age = age
        
    @property        # 屬性裝飾器
    def age(self):
        return self.__age
    
    @age.setter     #更改屬性
    def age(self,age):
        self.__age = age
        
    @age.deleter
    def age(self):   #屬性刪除
        #def self.__age
    
tom = Person('Tom')
print(tom.age)
tom.age = 20
print(tom.age)

 


免責聲明!

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



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