偷學Python第十七天:面向對象(二)類的封裝
古之立大事者,不惟有超世之才,亦必有堅忍不拔之志。——蘇轼
文章目錄
- 偷學Python第十七天:面向對象(二)類的封裝
-
- 封裝的了解
- 私有類屬性、公開類屬性、私有執行個體屬性和公開執行個體屬性
-
- 公開類屬性
- 私有類屬性
- 公開執行個體屬性
- 私有執行個體屬性
- 私有屬性不一定真的私有
- 私有方法和公開方法
- 類的保留屬性
- 類的保留方法
- 今日學習總結
封裝的了解
封裝(Encapsulation):屬性和方法的抽象
- 屬性的抽象:對類的屬性(變量)進行定義、隔離和保護
分為私有屬性和公開屬性
可以選擇公開或隐藏屬性,隐藏屬性的内在機理- 私有屬性:隻能在類内部通路
- 公開屬性:可以通過類、對象名通路
- 方法的抽象:對類的方法(函數)進行定義、隔離和保護
分為私有方法和公開方法
可以選擇公開或隐藏方法,隐藏方法的内部邏輯- 私有方法:隻能在類内部通路
- 公開方法:可以通過類、對象名通路
- 目标是形成一個對外可操作屬性和方法的接口
封裝就是讓資料和代碼稱為類的過程,表達為:類-——屬性——方法
私有類屬性、公開類屬性、私有執行個體屬性和公開執行個體屬性
公開類屬性
公開類屬性就是類屬性,文法結構
class ClassName:
<類屬性名> = <類屬性初值>
def __init__(self,[參數1], [參數2], ...[參數n]):
self.<執行個體屬性名> = <執行個體屬性初值>
...
私有類屬性
私有類屬性隻能目前類進行通路,子類不能通路。文法結構
class ClassName:
<__私有類屬性名> = <私有類屬性初值>
def __init__(self,[參數1], [參數2], ...[參數n]):
self.<執行個體屬性名> = <執行個體屬性初值>
...
私有類屬性定義的時候屬性名字前面需要兩個下劃線(
__
).
隻能在類的内部被方法所通路
不能通過
或者
<類名>.<類屬性>
<對象名>.<類屬性>
的方式通路
有效保證了屬性維護的可控性
示例代碼
"""
-*- coding:uft-8 -*-
author: 小甜
time:2020/5/15
"""
class TestClass:
__number = 0
def __init__(self, num_value):
for i in range(num_value + 1):
TestClass.__number += i
@classmethod # 類方法
def sum_number(cls):
return TestClass.__number
value1 = TestClass(100)
print(TestClass.sum_number()) # 5050
# print(value1.__number) # AttributeError: 'TestClass' object has no attribute '__number'
在類外賣通路就會報出
.__number
異常
AttributeError
公開執行個體屬性
公開執行個體屬性就等于示例屬性,文法結構
class <類名>:
<類屬性名> = <類方法值>
def __init__(self, <參數清單>):
self.<執行個體屬性名> = <執行個體屬性值>
...
私有執行個體屬性
私有執行個體屬性隻能在目前類内部使用,子類也不能使用。文法結構
class <類名>:
<類屬性名> = <類方法值>
def __init__(self, <參數清單>):
self.<__私有執行個體屬性名> = <執行個體屬性值>
...
私有執行個體屬性定義的時候屬性名字前面需要兩個下劃線(
__
).
隻能在類的内部被方法所通路
不能通過
或者
<類名>.<類屬性>
<對象名>.<類屬性>
的方式通路
有效保證了屬性維護的可控性
示例代碼
"""
-*- coding:uft-8 -*-
author: 小甜
time:2020/5/15
"""
class TestClass:
def __init__(self, num_value):
self.__number = 0
for i in range(num_value + 1):
self.__number += i
def sum_number(self):
return self.__number
value1 = TestClass(100)
print(value1.sum_number()) # 5050
# print(value1.__number) # AttributeError: 'TestClass' object has no attribute '__number'
私有屬性不一定真的私有
私有屬性的雙下劃線隻是一種轉換約定,轉換後,類内原有名字發生了變化,這是一種形式上的私有
示例代碼
"""
-*- coding:uft-8 -*-
author: 小甜
time:2020/5/15
"""
class TestClass:
def __init__(self, num_value):
self.__number = 0
for i in range(num_value + 1):
self.__number += i
def sum_number(self):
return self.__number
value1 = TestClass(100)
print(value1.sum_number()) # 5050
print(value1._TestClass__number) # 5050
# 可以通過 對象名._類名__屬性 的方式來通路
可以通過 對象名._類名__屬性
的方式來通路。
私有方法和公開方法
定義方法是在類内部定義并使用的方法。文法結構
class <類名>:
def <__私有方法名>(self, <參數清單>):
...
私有方法定義的時候屬性名字前面需要兩個下劃線(
__
).
各類方法都可以通過增加雙下換線的方式将方法變為私有方法
私有方法在形式上保護了Python類内部使用的函數邏輯
私有屬性與公開是程式員邏輯,不是安全邏輯,重視約定
類的保留屬性
Python解釋器預留的類屬性,以雙下換線開頭或者結尾。
- 保留屬性也叫特殊屬性
- 以雙下劃線開頭和結尾
- 作用是為了解Python類提供了統一的屬性接口
- 屬性值具有特殊的含義,類定義後直接使用
僅用
<類名>
通路的保留屬性
保留屬性 | 描述 |
---|---|
| 類的名詞 |
| 以 分隔從模闆全局命名空間開始的類名稱 |
| 類所繼承的基類名稱 |
示例代碼
"""
-*- coding:uft-8 -*-
author: 小甜
time:2020/5/15
"""
class TestClass:
def __init__(self, num_value):
self.number = 0
for i in range(num_value + 1):
self.number += i
class TestClass1:
def __init__(self):
print("這是嵌套的類")
def sum_number(self):
return self.number
value1 = TestClass(100)
print(TestClass.__name__, TestClass.__qualname__, TestClass.__base__)
# TestClass TestClass <class 'object'>
print(TestClass.TestClass1.__name__, TestClass.TestClass1.__qualname__, TestClass.TestClass1.__base__)
# TestClass1 TestClass.TestClass1 <class 'object'>
可以用類或者對象名通路的保留屬性
保留屬性 | 描述 |
---|---|
| 包含類成員資訊的字典,key是屬性和方法名稱,value是位址 |
| 包含對象執行個體屬性資訊的字典,key是屬性名稱,value是值 |
| 對象所對應的類資訊,即type資訊 |
| 類描述,寫在類定義下的首行字元串,不能繼承 |
| 類所在的子產品名稱 |
示例代碼
"""
-*- coding:uft-8 -*-
author: 小甜
time:2020/5/15
"""
class TestClass:
def __init__(self, num_value):
self.number = 0
for i in range(num_value + 1):
self.number += i
def sum_number(self):
return self.number
value1 = TestClass(100)
print(TestClass.__dict__) # {'__module__': '__main__', '__init__': <function TestClass.__init__ at 0x0000019C2A389620>, 'sum_number': <function TestClass.sum_number at 0x0000019C2A389598>, '__dict__': <attribute '__dict__' of 'TestClass' objects>, '__weakref__': <attribute '__weakref__' of 'TestClass' objects>, '__doc__': None}
print(value1.__dict__) # {'number': 5050}
print(TestClass.__class__) # <class 'type'>
print(value1.__class__) # <class '__main__.TestClass'>
print(TestClass.__module__) # __main__
print(value1.__module__) # __main__
類的保留方法
保留方法是Python解釋器預留的方法,以雙下劃線開頭和結尾
- 保留方法也叫特殊方法
- 以雙下劃線開頭和結尾
- 作用是為了解Python類提供了統一的方法接口
- 方法邏輯:具有特定的含義,一般與操作符關聯,類定義需要重載
Python保留的基礎方法
保留方法 | 對應操作 | 描述 |
---|---|---|
| | 初始化執行個體對象的函數邏輯 |
| | 删除執行個體對象的函數邏輯 |
| | 定義對象可列印字元串的函數邏輯 |
| | 定義對象字元串轉換操作的函數邏輯 |
| | 定義對象位元組串轉換操作的函數邏輯 |
| | 定義對象格式化輸出的函數邏輯 |
| | 定義對象布爾運算的函數邏輯 |
| | 定義對象長度操作的函數邏輯 |
| | 定義對象逆序的函數邏輯 |
| | 定義對選哪個絕對值操作的函數邏輯 |
| | 定義對象整數轉換的邏輯函數 |
Python保留的比較方法
保留方法 | 對應操作 |
---|---|
| |
| |
| |
| |
| |
| |
Python中超過了100個保留方法(好像給自己挖了個坑)
保留方法對應對象、對象間、對象方法的各種操作
今日學習總結
Python類的封裝的概念,定義私有屬性或者方法使用雙下換線開頭(注意:Python中并沒有實作真正的私有),保留屬性和方式是雙下劃線開始和結束的