06 02 物件導向的特徵一 封裝

2022-09-21 13:03:10 字數 3353 閱讀 8896

定義屬性就是為了使用,所以隱藏並不是目的,隱藏屬性的目的在於限制類外部對資料的直接操作

然後類內應該提供相應的介面來允許類外部間接地運算元據

介面之上可以附加額外的邏輯來對資料的操作進行嚴格地控制

這就是隱藏屬性和開放介面的意義

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的第二種使用方法

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:

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 大毛...