繼承、封裝、多型
封裝對外部隱藏資訊,不能隨意訪問/修改物件的資料、方法
通過限制類的屬性和方法的訪問方式,實現「封裝」
封裝的三個層次
類的封裝:外部可以任意訪問/修改類中的屬性和方法
私有屬性:外部不可以訪問/修改類的屬性或方法
公有方法+私有屬性:外部有條件限制的訪問/修改屬性,呼叫方法
封裝的表現
類的定義:將某些特定屬性和方法進行 「隔離」
每個學生有自己的年齡,外部可以通過物件任意讀取或修改
class
student
:def
__init__
(self, name, age)
: self.name = name
self.age = age
s1 = student(
"李白",18
)s2 = student(
"杜甫",20
)print
(s1.age)
s1.age =
200# 可隨意更改
print
(s1.age)
屬性私有:兩個下劃線開頭的屬性就是私有屬性。私有屬性只能在類的內部使用,外部不能使用。
不讓外部讀取/修改學生的年齡。
class
student
:def
__init__
(self, name, age)
: self.name = name
self.__age = age # 使用2個下劃線開頭的屬性,定義為私有屬性
s1 = student(
"李白",18
)# print(s1.__age) # 外界無法直接通過屬性名來訪問
# __dict__
print
(s1.__dict__)
# 檢視s1的所有屬性
print
(s1._student__age)
# 可通過_student__age 訪問私有屬性
【 私有屬性 + 公有方法】
私有屬性 + 公有方法:可以實現「有限制條件的開放給外部」,例如:可以讀取年齡,但是不能隨意修改年齡。
class
student
:def
__init__
(self, name, age)
: self.name = name
self.__age = age
defgetage
(self)
:return self.__age
defsetage
(self, age):if
0< age <=
130:
self.__age = age
else
:print
("不能隨意修改"
)s1 = student(
"李白",18
)print
(s1.getage())
s1.setage(
200)
print
(s1.getage(
))
封裝的常用(簡化)寫法
裝飾器的概念:以@開頭,呼叫另乙個函式(或方法),擴充套件了對「所修飾方法」的功能。
property裝飾器修飾的屬性用來返回屬性值;還可以繼續進行setter的設定,用來設定屬性值。
class
dog:
@property
defbark
(self)
:print
("汪汪"
)return
"return值"
d = dog(
)s = d.bark
print
(s)
簡化student
class
student
:def
__init__
(self, name, age)
: self.name = name
self.__age = age
@property
defage
(self)
:return self.__age
@age.setter
defage(self, age):if
0< age <=
130:
self.__age = age
else
:print
("不能隨意修改"
)s1 = student(
"李白",18
)print
(s1.age)
s1.age =
20print
(s1.age)
使用 @property 裝飾器時,方法名不必與屬性名相同.
可以更好地防止外部通過猜測私有屬性名稱來訪問
凡是賦值語句,就會觸發set方法。獲取屬性值,會觸發get方法
擴充套件
# 私有方法,可以在類內部使用
# 可以有條件的開放給外部
class
student
:def
talk
(self, identity)
:if identity ==
"鐵子"
: self.__tellsecrect(
)else
:print
("speak..."
)def
__tellsecrect
(self)
:print
("..."
)s = student(
)s.talk(
"鐵子"
)
Python高階 類之封裝
封裝 第乙個層面的封裝 類就是麻袋,這本身就是一種封裝第二個層面的封裝 類中定義私有的,只有在類的內部使用,外部無法訪問 第三個層面的封裝 明確區分內外,內部的實現邏輯,外部無法知曉,並且為封裝到內部的邏輯提供了乙個訪問介面給 外部使用 封裝的本質是為了明確的區分內外部。python約定 約定一 任...
Javascript 高階 封裝
js中處處是物件,物件導向的第一步當然就是封裝了。由於js中沒有類的概念,所以封裝起來也比較麻煩。以下介紹兩種js的封裝。1 使用約定優先的原則,將全部的私有變數以 開頭 看完 是不是有種被坑的感覺。只把全部的變數以 開頭,事實上還是能夠直接訪問的,這能叫封裝麼。當然了。說了是約定優先嘛,這樣的方式...
Python高階 3 1再議 封裝 繼承 多型
封裝 繼承 多型 是物件導向的3大特性 使用函式來開發,示例 如下 使用物件導向來開發,示例 如下 好處在使用面向過程程式設計時,當需要對資料處理時,需要考慮用哪個模板中哪個函式來進行操作,但是當用物件導向程式設計時,因為已經將資料儲存到了這個獨立的空間中,這個獨立的空間 即物件 中通過乙個特殊的變...