·特性是物件內部的變數
·物件的狀態由它的特性來描述,物件的方法可以改變它的特性
·可以直接從物件外部訪問特性
#定義
class
person:
name = 'yoda'
# 類中特性
defget_name
(self):
# 通過訪問器方法訪問特性
return self.name
defset_name
(self, value):
# 通過訪問器方法改變特性
self.name = value
#執行:
a1 = person()
a1.name # 直接從外部訪問特性
yoda
a1.name = 'master'
# 直接從外部改變特性
預設情況下,python支援從外部對特性進行操作,但它破壞了類的封裝原則,要從外部物件無法訪問,應該使用私有特性。
為了讓外部無法訪問特性或方法,只要在名字前面加上雙下劃線即可。
#定義
class
secret:
__name = 'yoda'
# 加上雙下劃線私有化特性
defget_name
(self):
return self.__name
def__secret
(self):
# 私有化方法
print
"can't find"
defaccess
(self):
return self.__secret() # 訪問器訪問私有方法
#執行
a2 = secret()
a2.__name # 訪問不到特性!
a2._secret__name # 還是可以從外部訪問特性
yoda
python本質上並不完全支援私有化,只不過是將名字進行改變了
·有一些物件導向語言支援私有特性,這些特性無法從外部直接訪問,要編寫getter和setter方法對這些特性進行操作
·python不需要getter和setter方法,因為python中所有特性都是公開的,如果不放心使用直接訪問物件的特性,可以為物件便攜setter和getter方法,但是跟好的解決辦法是使用屬性(property)
·python隱藏訪問器地方法,讓所有特性看起來一樣,這種通過訪問其定義的特性被稱為屬性。
# 第一種方法使用屬性
class
foo:
def__init__
(self):
self.name = 'yoda'
self.work = 'master'
defget_person
(self):
return self.name,self.work
defset_person
(self,value):
self.name,self.work = value
person = property(get_person,set_person)
執行如下:
a3 = foo()
a3.person
('yoda', 'master')
a3.person = 'skylaer','programer'
a3.person
('skylaer','programer')
# 第二種方法使用屬性
class
foo:
def__init__
(self):
self.name = 'yoda'
self.work = 'master'
@property
defperson
(self):
return self.name,self.work
@person.setter # 如果不指定stter屬性,那麼無法從類的外部對它的值進行設定,這對於唯讀特性非常有用
defperson
(self,value):
self.name,self.work = value
·property()第乙個引數是getter方法,第二個引數是setter方法
·property函式可以用0,1,2,3或者4個引數來呼叫,如果沒有引數,產生的屬性既不可讀也不可寫,這四個引數分別叫做fget、fset、fdel、fdoc,如果想要乙個屬性是只寫的,並且有乙個文件字串,能使用它們作為關鍵字引數。
python 私有化屬性
python 沒有和其他程式語言一樣的定義共有屬性和私有屬性的關鍵字,實現屬性私有化和屬性保護,都是使用 格式進行的偽效果。私有化使用場景 保護屬性 比如銀行存款等,存款直接外放非常危險,就可以私有化,然後通過類提供的方法增加刪減鉛筆的金額,對存款進行保護。內部過濾 過濾一下不符合屬性的資料,資料不...
python私有化方法 Python 私有化
python中的私有變數和私有方法仍然是可以訪問的 訪問方法如下 私有變數 例項.類名 變數名 私有方法 例項.類名 方法名 python並沒有真正的私有化支援,但可用下劃線得到偽私有。盡量避免定義以下劃線開頭的變數 1 單下劃線 開始的成員變數叫做保護變數,意思是只有類例項和子類例項能訪問到這些變...
Python中屬性的私有化
1.引入 在python物件導向程式設計過程中,修改類屬性都是直接通過類名修改的,如果有些重要的屬性不希望他人任意修改怎麼辦呢?這就要用到屬性私有化功能。2.概念 保護屬性安全,使其不能隨意修改,將屬性定義為私有屬性,新增乙個可呼叫的方法去使用。3.語法 兩個下劃線開頭,宣告該屬性為私有,不能在類的...