一、訪問控制私有屬性
- 使用雙下划線開頭符屬性名,就是私有屬性
- 私有變量的本質:類定義的時候,如果聲明一個實例變量的時候,使用雙下划線,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)