0718-面相對象(2)
如果沒定義__str__則print的時候默認打印__repr__
__add__,定義之后就是'+'號,__iadd__,定義之后就是'+='號
如果沒有__iadd__,就默認調(diào)__add__,__iadd__是+=,累加,可變數(shù)據(jù)+=前后都是相同地址/對象? # __iadd__
不可變數(shù)據(jù),比如元組+=前后是不同地址,所以元組確實不能變,你硬+就是給你換了個新地址/對象? #__add__ return hself
也就是說__add__一定返回新,__iadd__一定返回舊
在class里定義__repr__,返回一個符合python語法的字符串
然后就能eval(repr(a1))
;‘
重要: __eq__是比較運算符(==)的魔法方法,默認是按照地址比較,重寫一般可以把他比較內(nèi)容
__gt__是比較運算符(>)大于,而且python自帶的max,min,sort,index,count都會受這個影響(不止這些,remove,in啊,等等還有非常非常多的函數(shù))
python的list里給你專門重寫了eq的,比較的不再是地址,而是內(nèi)容
或許python跟其他不一樣就因為這些,方便,但是性能低,因為他比較啊,這些底層的魔法方法相對于C++,C等等來說要復雜很多
就比如==,python會給你比較內(nèi)容,方便,但是慢; C++就只給你比較地址,很麻煩,但是快
再查了GPT之后發(fā)現(xiàn)魔法方法不是主要的,但是確實在特定環(huán)境下重寫魔法方法會節(jié)省一定的性能開銷
舉個例子,如果你需要自定義一個類來表示大量的數(shù)據(jù),而且你知道在進行比較操作時,并沒有必要考慮所有的實例屬性,
你可以手動重寫__eq__(相等)和__ne__(不等)魔法方法,只比較你認為重要的屬性,從而避免不必要的屬性比較,從而提高性能
然而,需要注意的是,這種優(yōu)化可能會犧牲一些代碼的可讀性和?靈活性。在進行性能優(yōu)化時,最好先進行性能測試,確保自己的優(yōu)化確實有顯著的效果
另外,Python的運行速度一般是受到算法和數(shù)據(jù)結(jié)構(gòu)的影響更大,對這些進行優(yōu)化可能會比簡單地重寫魔法方法更有效
所以其實在C,C++等這些里面可以自己定義類似于python的函數(shù)或魔法屬性,也就是自己寫一個庫,會比python的更快
然而,需要注意的是,使用編譯型語言編寫庫通常需要更多的時間和努力,因為你需要手動管理內(nèi)存、處理指針等低級別的操作
這個改魔法屬性的很靈活,筆記上不好記,但是牢記很多東西是基于eq來比較的,所以更改eq很靈活,也要謹慎的對待
remove可以理解為電腦,然后廠商就想我要鏈啥,麥克風,攝像頭,那么他就做了個接口(USB),相當于pyt的hon里的object
我們做的這些模型相當于就是所有的計算機外設(shè),這就是軟件設(shè)計架構(gòu)的基本思想
客戶端代碼 --> 接口(父類,爸爸) -約束/規(guī)定/統(tǒng)一-> 具體功能
面向?qū)ο蠹軜?gòu)設(shè)計思想
總結(jié):
1. 封裝 根據(jù)需求劃分為多個類型,為每個類型分配職責
分而治之,變而疏之,分治法
2. 繼承 統(tǒng)一多個類型的共性行為 聽父類的
所以不能改框架,比如remove,但是能改eq,能改比較的規(guī)則,隔離客戶端代碼與各種功能的變化
3. 多態(tài) 父類的方法在子類上有不同的體現(xiàn)(被重寫了) 聽子類的
編碼時調(diào)用父類行為,運行時創(chuàng)建子類對象執(zhí)行子類行為
所以父類是框架,調(diào)用它是因為穩(wěn)定,如果你創(chuàng)建的時候調(diào)用的是那個具體的Model,調(diào)用的就是Model具體的eq策略(或其他)了
這樣就可以達成本次的目標: ---開閉原則---
對擴展開放,對修改關(guān)閉
允許以類為單元增加新功能,不用(不能)修改客戶端代碼
舉個例子,remove就是客戶端,他不改吧,但是每天做這些新代碼他都能幫我們刪掉
print也是,他能打印各種各樣新的類型,但是函數(shù)本身沒變過
只需要修改__str__,__eq__等就行
所以這個框架實際上類似于HTTP協(xié)議,把后續(xù)擴展的東西規(guī)定格式(函數(shù)名,參數(shù),返回值)
以便于后續(xù)功能擴展和客戶端對接,這里引用GPT的話一下:
面向?qū)ο蟮募軜?gòu)用于設(shè)計和開發(fā)復雜的軟件系統(tǒng)。它提供了一種組織和管理系統(tǒng)中各個組件的方式,使得系統(tǒng)具有更好的可維護性、可復用性和擴展性。以下是面向?qū)ο蟮募軜?gòu)的幾個主要目標:
? ? 模塊化:面向?qū)ο蟮募軜?gòu)將系統(tǒng)劃分為多個獨立的模塊,每個模塊都具有清晰的功能和接口。這種模塊化的設(shè)計使得系統(tǒng)更易于理解、修改和維護。
? ? 封裝:面向?qū)ο蟮募軜?gòu)通過封裝數(shù)據(jù)和操作,將數(shù)據(jù)和操作組織為一個整體。這樣可以隱藏實現(xiàn)細節(jié),
? ? 使得模塊之間的耦合降低,提高了代碼的可重用性和模塊的獨立性。
? ? 繼承:面向?qū)ο蟮募軜?gòu)通過繼承機制,實現(xiàn)了代碼的重用。
? ? 通過繼承,可以定義一個通用的基類,然后通過派生類對基類進行擴展和定制。這樣可以減少代碼的冗余,提高了代碼的復用性和可維護性。
? ? 多態(tài):面向?qū)ο蟮募軜?gòu)通過多態(tài)性,提供了一種更加靈活和可擴展的設(shè)計方式。
? ? 多態(tài)性意味著對象可以根據(jù)具體的上下文和需求,以不同的方式響應(yīng)同一消息。這提高了系統(tǒng)的靈活性和可擴展性。
? ? 松耦合:面向?qū)ο蟮募軜?gòu)通過封裝、繼承和多態(tài)性,實現(xiàn)了模塊之間的低耦合性。
? ? 這意味著一個模塊的修改不會影響其他模塊的功能和實現(xiàn),使得系統(tǒng)更容易進行修改、擴展和維護。
綜上所述,面向?qū)ο蟮募軜?gòu)是為了提高軟件系統(tǒng)的可維護性、可復用性和擴展性。
它通過模塊化、封裝、繼承、多態(tài)和松耦合等特性,使得系統(tǒng)的設(shè)計更加靈活、可擴展、易于理解和維護。