定義屬性就是為了使用,所以隱藏並不是目的,隱藏屬性的目的在於限制類外部對資料的直接操作
然後類內應該提供相應的介面來允許類外部間接地運算元據
介面之上可以附加額外的邏輯來對資料的操作進行嚴格地控制
這就是隱藏屬性和開放介面的意義
python的class機制採用雙下劃線開頭的方式將屬性隱藏起來,
類屬性、物件屬性、方法屬性都可以隱藏
類中所有雙下滑線開頭的屬性都會在類定義階段、檢測語法時自動變成「_類名__屬性名」的形式
隱藏屬性對外不對內(對外隱藏,對內不隱藏)
可以通過類屬性檢視: 類名.__dict__
#隱藏屬性
class
student():
#隱藏類屬性
__country = '
china'#
_student__country
def__init__
(self, name, age):
#隱藏物件屬性
self.__name = name #
_student__name
self.age =age
#隱藏方法屬性
def__func(self): #
_student__func
print('
from func')
print(student.__dict__)
#開放介面,返回類內部的隱藏屬性值,並且可以增加限制
class student(): #
學生類__country = '
china'#
類屬性#
初始化方法,自定義物件屬性
def__init__
(self, name, age):
#隱藏物件屬性
self.__name = name #
_student__name
self.age =age
#隱藏方法屬性
def__func(self): #
_student__func
print('
from func')
#開放介面,返回隱藏的類的屬性值
defget_country(self):
return self.__country
#self._student__country
#增設限制
defset_country(self, v):
ifnot type(v) is
str:
print('
不是str')
return
self.
__country =v
print(student.__dict__)
python專門提供的乙個裝飾器property,可以將類中的函式「偽裝成」物件的資料屬性
物件在訪問該特殊屬性時會觸發功能的執行,然後將返回值作為本次訪問的結果
使用property有效地保證了屬性 訪問 的一致性,另外property還提供 設定 和 刪除 屬性的功能
#property 裝飾器
class
student():
#隱藏類屬性
__country = '
china'#
自定義物件屬性
def__init__
(self, name, age):
#隱藏物件屬性
self.__name = name #
_student__name
self.age =age
#隱藏方法屬性
def__func(self): #
可以通過_student__func呼叫
print('
from func')
#通過@property把函式偽裝成屬性
#該特殊屬性作為介面,返回了原來的隱藏屬性的值
@property
defcountry(self):
return self.__country
#可以通過self._student__country檢視
#property提供的設定功能(改的操作)
@country.setter
defcountry(self, v):
ifnot type(v) is
str:
return
self.
__country =v
#property提供的刪除屬性
@country.deleter
defcountry(self):
del self.__country
stu = student('
tom', 18) #
例項化,產生stu物件
print(stu.country) #
通過 物件名.特殊屬性名 呼叫
stu.country = '
***'
#修改屬性值
#print(stu.country)
del stu.country #
刪除屬性值
補充:property的第二種使用方法
classstudent():
__country = '
china
'def
__init__
(self, name, age):
self.
__name = name #
_student__name
self.age =age
def__func(self): #
_student__func
print('
from func')
defget_country(self):
return self.__country
#self._student__country
defset_country(self, v):
ifnot type(v) is
str:
return
self.
__country =v
defdel_country(self):
del self.__country
country =property(get_country, set_country, del_country)
stu = student('
tom', 18) #
查stu.country = '
american'#
改del stu.del_country #
刪
物件導向三大特徵之一 封裝
封裝 將類的某些資訊隱藏在類內部,不允許外部程式直接訪問,而是通過該類提供的方法來實現對隱藏資訊的操作和訪問 封裝的步驟 1 屬性私有化 2 提供公共的設定器和訪問器 3 在設定器和訪問器中新增業務校驗邏輯 private 私有的,對外不可見 private string name private ...
java物件導向特徵之一 封裝與隱藏
使用者對類內部定義的屬性 物件的成員變數 的直接操作會導致資料錯誤,混亂或安全性問題。解決方法 將類的屬性保護起來,防止亂用。保護的方式 資訊隱藏 當建立了類的物件以後,如果直接通過 物件.屬性 的方式對相對應的物件屬性賦值的話,可能會出現於實際情況相違背的意外,故,不考慮讓物件來直接作用於屬性,而...
js物件導向程式設計一 封裝
js是物件導向程式設計的語言,既是它的函式,陣列,屬性都是物件,可以設定物件的屬性和方法。一.生成物件的原始模式 假定把貓看成乙個物件,它有name和color兩個屬性.var cat 現在,我們需要根據這個原型物件的規格,生成兩個例項物件.var cat1 建立乙個空物件 cat1.name 大毛...