天天看點

偷學Python第十七天:面向對象(二)類的封裝偷學Python第十七天:面向對象(二)類的封裝

偷學Python第十七天:面向對象(二)類的封裝偷學Python第十七天:面向對象(二)類的封裝

偷學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類提供了統一的屬性接口
  • 屬性值具有特殊的含義,類定義後直接使用

僅用

<類名>

通路的保留屬性

保留屬性 描述

__name__

類的名詞

__qualname__

.

分隔從模闆全局命名空間開始的類名稱

__bases__

類所繼承的基類名稱

示例代碼

"""
-*- 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'>

           

可以用類或者對象名通路的保留屬性

保留屬性 描述

<類>.__dict__

包含類成員資訊的字典,key是屬性和方法名稱,value是位址

<對象>.__dict__

包含對象執行個體屬性資訊的字典,key是屬性名稱,value是值

__class__

對象所對應的類資訊,即type資訊

__doc__

類描述,寫在類定義下的首行字元串,不能繼承

__module__

類所在的子產品名稱

示例代碼

"""
-*- 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保留的基礎方法

保留方法 對應操作 描述

obj.__init__()

obj = ClassName()

初始化執行個體對象的函數邏輯

obj.__del__()

del obj

删除執行個體對象的函數邏輯

obj.__repr__()

repr(obj)

定義對象可列印字元串的函數邏輯

obj.__str__()

str(obj)

定義對象字元串轉換操作的函數邏輯

obj.__bytes__()

bytes(obj)

定義對象位元組串轉換操作的函數邏輯

obj.__format__()

obj.format

定義對象格式化輸出的函數邏輯

obj.__bool__()

bool(obj)

定義對象布爾運算的函數邏輯

obj.__len__()

len(obj)

定義對象長度操作的函數邏輯

obj.__reversed__()

obj.reversed()

定義對象逆序的函數邏輯

obj.__abs__()

abs(obj)

定義對選哪個絕對值操作的函數邏輯

obj.__int__()

int(obj)

定義對象整數轉換的邏輯函數

Python保留的比較方法

保留方法 對應操作

obj.__lt__()

obj1 < obj2

obj.__le__()

obj1 <= obj2

obj.__eq__()

obj1 == obj2

obj.__be__()

obj1 != obj2

obj.__gt__()

obj1 > obj2

obj.__ge__()

obj1 >= obj2

Python中超過了100個保留方法(好像給自己挖了個坑)

保留方法對應對象、對象間、對象方法的各種操作

今日學習總結

Python類的封裝的概念,定義私有屬性或者方法使用雙下換線開頭(注意:Python中并沒有實作真正的私有),保留屬性和方式是雙下劃線開始和結束的