周總結

  • 2022 年 7 月 31 日
  • 筆記
  • 目錄
    • 編程思想
      • 面向過程
      • 面向對象
        • 定義
        • 對象與類
        • 三大特徵
        • 派生
        • 反射
        • 魔法方法(雙下方法)
        • 元類
  • 編程思想

   1.面向過程:按照順序及流程編寫程式碼最終達到想要的結果(面向對象之前的編程都屬於面向過程編程)

   2.面向對象:

    2.1 定義:將特定的數據與特定的方法綁定(只考慮最初的創建不考慮結構:如遊戲人物構造)

   註:面向過程與面向對象沒有優劣之分按照不同的情況使用,多數情況下是相互存在使用

    2.2.對象與類

     2.2.1 對象:將特定數據與特定方法綁定的存儲容器(防止數據被別的方法引用,也防止方法引用別的數據,互相綁定完成想要的目標)

     2.2.2 類:多個對象共同的數據與方法的存儲容器(方法也是對象特有方法(創建獨特對象的方法)通過類去創建出含有共同數據也含有自己獨特數據的對象)

      2.2.2.1 類的語法結構

       關鍵字:class

       類名:與變數名命名一致(首字母大寫-大駝峰形式)

       類體編碼:數據與方法

      2.2.2.2 對象的創建-類名加括弧(類的實例化)

    2.3 面向對象的三大特徵

      2.3.1 綁定:將一些數據採用(__name)雙下劃線的格式對數據進行隱藏,然後通過統一的方法進行訪問(其實python沒有強制要求只不過是換了名字,但還是要遵循規則,不然就沒有存在的意義)

        property偽裝:將需要輸出的數據按照實際性質區分進行輸出 

      2.3.2 多態:一種形態的多種表現形式,繼承父類然後使用與父類相同的方法但數據輸出屬於對象自己特性

      2.3.3 繼承:引用別的類所擁有的數據或方法,使重複程式碼減少。

         被繼承的類:父類、基類、超類

         接收繼承的類:子類、派生類

      2.3.4 對象名字查找順序:自身>>>創建自身的類>>>繼承的父類>>>多繼承的父類分支>>>繼承分支最後分類共同繼承的類

     2.3.5 經典類與新生類

       經典類:沒有自動繼承object類的類(python2環境)

       新生類 :自動繼承object類的類(python3環境)  

   2.4 派生方法:在子類中定義父類的功能並增加功能,重寫父類方法後做修改後要繼續沿用父類方法的後續步驟,用supor().父類方法名()

     派生案例:將時間字典序列化成json格式,由於序列化數據類型的要求,時間類型不屬於json格式序列化的數據類型

          json函數中參數cls = JSONEncoder(是個類)

          類中影響數據類型的方法是def default(self, o)

          用派生方法在原有方法上做數據類型轉換

          最後繼續執行父類JSONEncoder的後續步驟完成時間類型序列化

   2.5 反射:通過字元串來操作對象的數據或方法,存在關鍵字字元串、對象肯定是需要進行反射操作

      2.5.1 反射方法

        2.5.1 hasattr():判斷對象是否含有某個字元串對應的屬性

        2.5.2 getattr():獲取對象字元串對應的屬性

        2.5.3 setattr():根據字元串給對象設置屬性

        2.5.4 delattr():根據字元串給對象刪除屬性

      2.5.2 反射案例

from conf import settings

# 判斷settings文件中大寫的數據並獲取該數據
# 創建大寫數據存儲列表
upper_dict = {}
info_dict = dir(settings)
for i in info_dict:
    if i.isupper():
        v = getattr(settings, i)
        upper_dict[i] = v

print(upper_dict)   # {'BASE_PATH': 'D:\\code\\python\\day34', 'DB_PATH': 'D:\\code\\python\\day34\\db'}

   2.6 魔法方法:雙下方法、需要一些觸動方法

     2.6.1 __init__:實例化時觸發(類創建對象時)

class School:
    school = '南蕪大學'

    def __init__(self, major):
        self.major = major
        print('__init__')     # __init__


stu = School('攝影專業')
print(stu.major)             # 攝影專業

   2.6.2 __str__:列印時觸發、需要返回值,不寫return或寫return後面不寫東西否返回None--print(stu.__str__())

class School:
    school = '南蕪大學'

    def __str__(self):
        print('__str__')     # __str__
        # return '111'       # None


stu = School()
print(stu.__str__())  # 攝影專業

   2.6.3 __call__:對象加括弧列印時觸發--print(stu()) 

class School:
    school = '南蕪大學'

    def __call__(self, *args, **kwargs):
        print('__call__')     # __call__
        print(args)           # ()
        print(kwargs)         # {}
        return '攝影專業'


stu = School()
print(stu())     # 攝影專業

   2.6.4 __getattr__:當對象獲取一個存在的屬性名 自動觸發 該方法返回什麼 

class School:
school = '南蕪大學'

def __init__(self, name, age):
self.name = name
self.age = age

def __getattr__(self, item):
print('__getattr__') # __getattr__
return '攝影專業'


stu = School('jason', 18)
print(stu.__getattr__('name')) # 攝影專業
print(stu.__dict__) # {'name': 'jason', 'age': 18}

  2.6.5 __getattrbute__:當對象獲取一個存在或不存在的屬性名 自動觸發 該方法返回什麼 

class School(object):
    school = '南蕪大學'

    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __getattribute__(self, item):
        print('__getattribute__')      # __getattribute__
        print(item)               # age
        return super().__getattribute__(item)      # 18


stu = School('jason', 18)
print(stu.age)          # 18

   2.6.6 __setattr__:對象操作屬性值的時候自動觸發>>>:  對象.屬性名=屬性值

class School:
school = '南蕪大學'

def __setattr__(self, key, value):
print('__setattr__') # __getattr__
print(key) # major
print(value) # 攝影專業
return '攝影專業'


stu = School()
print(stu.__setattr__('major', '攝影專業')) # 攝影專業

   2.6.7 __delattr__:對象在被刪除(主動 被動)的時候自動觸發

class School:
    school = '南蕪大學'

    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __delattr__(self, item):
        print('__setattr__')      # __setattr__
        print(item)               # major
        return '攝影專業'


stu = School('jason', 18)
print(stu.__delattr__('name'))     # 攝影專業

   2.7 元類:產生類的類(type)

class Mytype():
    def __call__(self, *args, **kwargs):
        print('產生類的類')


obj = Mytype()
print(type(obj))  # <class '__main__.Mytype'>
print(type(Mytype))  # <class 'type'>

    2.7.1 產生類的方式     

      1.class關鍵字
        class MyClass:
            pass

      2.利用元類type
        type(類名,類的父類,類的名稱空間)

    2.7.2 __new__

     類產生對象的步驟
      1.產生一個空對象
      2.自動觸發__init__方法實例化對象
      3.返回實例化好的對象

       __new__方法專門用於產生空對象 骨架

       __init__方法專門用於給對象添加屬性

 

  

  

       

       

 

Tags: