周總結
- 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__方法專門用於給對象添加屬性

