零基礎學習Python(三)

1. 多重繼承

一個子類可以繼承多個父類,這與一些編程語言的規則不通。

如果多個父類中有同名的變量和方法,子類訪問的順序是按照繼承時小括號里書寫的順序進行訪問的。

可以用issubclass(B, A)方法判斷B是否為A的子類。

2. 綁定

類中的方法通過參數self與對象綁定,通過參數cls與類綁定,如果不用self或者cls來訪問類中的變量或者方法,會報錯找不到變量或者方法,或者達不到預期效果。

class C:x = 100def set_x(self, v):x = vc = C()
c.set_x(520)

上述代碼既不會改變對象c的屬性x,也不會改變類C的屬性x,set_x方法只是在函數內部建立了一個臨時變量。

3. 重寫與鉆石繼承

先定義父類:

class C:def __init__(self, x, y):self.x = xself.y =ydef add():return self.x + self.ydef mul():return self.x * self.y

定義子類,并且重寫父類的方法,同時調用父類的方法:

class D(C):def __init__(self, x, y, z):C.__init__(self, x, y)self.z = zdef add():return C.add(self) + self.zdef mul():return C.mul(self) * self.z

如果是鉆石繼承,這種直接通過類名調用類里面方法的方式可能會出現問題。什么是鉆石繼承?就是有兩個類同時繼承了同一個父類,然后另外一個類繼承了這兩個類,繼承關系拓撲圖類似于一個鉆石(菱形):

鉆石繼承的問題如下:

可以發現,類A初始化了兩次!使用super()函數可以解決上述問題,類B1、類B2、類C的代碼修改如下:

class B1(A):def __init__(self):super().__init__()print("哈嘍,我是B1~")class B2(A):def __init__(self):super().__init__()print("哈嘍,我是B2~")class C(B1, B2):def __init__(self):super().__init__()print("哈嘍,我是C~")

使用super()方法調用__init__方法,不用傳遞self參數,因為super方法會自動解決。super函數的原理依賴于Python的MRO(Method Resolution Order:方法解析順序),這可以通過類的方法mro()或者變量__mro__查看:

關于MRO順序的一個案例:

class Displayer:def display(self, msg):print(msg)class LoggerMixin:def log(self, msg, filename):with open(filename, 'a') as f:f.write(msg)def display(self, msg):super().display(msg)self.log(msg)class MySubClass(LoggerMixin, Displayer):def log(self, msg):super().log(msg, filename="subclasslog.txt")subcls = MySubClass()
subcls.display("This is a test.")

運行結果是打印This is a test,并且生成subclasslog.txt,里面內容是This is a test。查看MySubClass的MRO順序:

?

那么調用subcls的display方法,先去LoggerMixin里面找display方法,找到了,但是第一句是super().display(msg),此時不要以為會去LoggerMixin類的父類object里面找display方法,而是按照MRO順序去Displayer里面找display方法,從而打印出This is a test,然后執行LoggerMixin力的display方法的第二句:self.log(msg),即調用MySubClass里面的log方法,發現沒有,按照MRO順序去LoggerMixin類里找log方法,找到了,即寫入文件內容為msg。

4. __slots__屬性

對象的屬性除了直接obj.x = valueX這種方式設置外,還可以通過其字典__dict__的方式設置,比如:

c.__dict__['z'] = 666

?

Python中對象是可以隨意添加任何屬性的,這些屬性存放在字典中,雖然字典訪問效率高,但是浪費了很多空間,為了避免空間浪費,Python引入__slots__屬性,通過__slots__屬性設置一個類的對象只能擁有固定屬性:

class C:__slots__ = ["x", "y"]def __init__(self, x)self.x = x

?

除了動態添加屬性不行,在類的方法(包括構造方法)內添加屬性也不行:

父類中的slots屬性是不會在子類中生效的(但是子類仍然繼承了父類的slots屬性,只是不起作用了):

5. 魔法方法

__new__方法是在__init__方法之前調用的,常見的self對象就是它返回的。創建一個類,使得傳給他的字符串始終為大寫:

class CapStr(str):def __new__(cls, string):string = string.upper()return super().__new__(cls, string)

?

因為CapStr繼承自str,所以str有的方法它也有:

對象被銷毀時會調用__del__方法:

class C:def __init__(self):print("我來了~")def __del__(self):print("我走了~")

?

注意,不是使用了del語句就會調用__del__這個魔法方法,而是對象被銷毀前才會調用,也就是說調用del語句并不會立即銷毀對象,只是銷毀對象的引用,只有當對象的引用都被銷毀時,才會去銷毀對象。比如將c再賦值給d,調用del?c不會觸發__del__魔法方法,接著調用del d才會觸發。?

既然__del__方法可以在對象被銷毀前動手動腳,那么可以通過將即將要銷毀的對象賦值給全局變量的方式,實現對象的重生。但是使用全局變量可能會污染命名空間,那么可以通過閉包的形式將對象傳遞給函數的參數,從而實現永久保存:

class E:def __init__(self, name, func):self.name = nameself.func = funcdef __del__(self):self.func(self)def outer():x = 0def inner(y=None):nonlocal xif y:x = yelsereturn xreturn inner

?

重寫add方法可以實現自定義的加法功能,比如字符串的相加不再是拼接,而是字符長度的相加:

?

注意,加號調用的是左邊對象的__add__方法,s1 + s2相當于s1.__add__(s2)。

__radd__方法的調用原則:如果加號兩邊的數據類型不同,并且左側對象沒有定義__add__方法,或者__add__方法實現為NotImplemented,那么Python就會去右側對象找__radd__方法。

__iadd__方法不僅進行加法運算,還會將運算后的結果賦值給左側對象,調用時機是使用了運算符+=:

__index__魔法方法是當對象作為索引值才會去調用,而不是對象的索引訪問觸發:

class C:def __index__(self):print("被攔截了~")return 3

關于屬性的方法:hasattr、getattr:

class C:def __init(self, name, age):self.name = nameself.__age = agec = C("小甲魚", 18)
hasattr(c, "name") # 返回True
getattr(c, "name") # 返回小甲魚

對于私有屬性,依然可以訪問:

getattr(c, "_c__age") # 返回18

設置屬性:

setattr(c, "_c__age", 19) # 返回18

刪除屬性:

delattr(c, "_c__age")

魔法方法__getattribute__會攔截getattr方法:?

class C:def __init(self, name, age):self.name = nameself.__age = agedef __getattribute__(self, attrname):print("拿來吧你~")return super().getattribute__(attrname)c = C("小甲魚", 18)
getattr(c, "name")

?

魔法方法__getattr__只有嘗試去獲取不存在的屬性時才會去觸發:

class C:def __init(self, name, age):self.name = nameself.__age = agedef __getattribute__(self, attrname):print("拿來吧你~")return super().getattribute__(attrname)def __getattr__(self, attrname):if attrname == 'FishC':print("I love FishC")elseraise AttributeError(attrname)c = C("小甲魚", 18)

?

給屬性賦值對應的魔法方法是__setattr__,但是這個方法里面的實現不能是self.attrname=value,因為這個語句又會調用魔法方法__setattr__,所以會死循環,正確做法是:

class D:def __setattr(self, attrname, value):self.__dict__[attrname] = value

同理,del語句刪除屬性時,也不能在魔法方法__del__中直接使用del self.attrname,否則也會無限循環,正確做法依然是操作self.__dict__這個字典:

class D:def __setattr(self, attrname, value):self.__dict__[attrname] = valuedef __delattr(self, attrname):self.__dict__[attrname]

????????

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/46303.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/46303.shtml
英文地址,請注明出處:http://en.pswp.cn/web/46303.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《TF2.x強化學習手冊》P59-P65-SARSA-Q-learning

文章目錄 實現SARSA算法和對應的強化學習智能體前期準備實現步驟工作原理初始化算法流程 構建基于Q學習的智能體前期準備實現步驟工作原理SARSA 算法的收斂性:SARSA 適合在線學習和真實系統:Q 學習算法的適用性: 實現SARSA算法和對應的強化學…

HDC使用常見命令

HDC(HarmonyOS Device Connector)是為開發人員提供的用于調試的命令行工具,通過該工具可以在windows/linux/mac系統上與真實設備進行交互。 使用HDC前,需要配置相關環境變量: 在此電腦 > 屬性 > 高級系統設置 &g…

Git常用命令以及使用IDEA集成Gitee

目錄 一、設置用戶簽名 二、初始化本地庫 三、查看本地庫狀態 四、添加文件到暫存區 五、提交本地庫 六、修改文件 七、版本穿梭 八、Git分支 九、分支的操作 9.1、查看分支 9.2、創建分支 9.3、切換分支 9.4、合并分支 十、團隊協作 十一、Idea集成Git 11.1、配…

Github 2024-07-15 開源項目周報 Top15

根據Github Trendings的統計,本周(2024-07-15統計)共有15個項目上榜。根據開發語言中項目的數量,匯總情況如下: 開發語言項目數量Python項目5非開發語言項目4JavaScript項目3TypeScript項目2Go項目1Solidity項目1Java項目1Rust項目1免費編程學習平臺:freeCodeCamp.org 創建…

3.1-RNN存在的問題以及LSTM的結構

文章目錄 1 RNN存在的問題1.1梯度消失問題1.2梯度爆炸問題1.3梯度爆炸的對策 2梯度消失的對策——LSTM2.1輸出門2.2遺忘門2.3輸入門2.4總結2.5 LSTM梯度的流動 1 RNN存在的問題 RNN存在梯度消失和梯度爆炸的問題。 書上以下圖的這句話為例,進行說明;為了…

前瞻斷言與后瞻斷言:JavaScript 正則表達式的秘密武器

JavaScript 中的前瞻斷言(lookahead)和后瞻斷言(lookbehind)相信用過的小伙伴就知道它的威力了,在一些特定的需求場景下,可以做到四兩撥千斤的作用,今天讓我們來盤點一下在 JavaScript 正則表達…

昇思25天學習打卡營第14天|munger85

基于MindNLPMusicGen生成自己的個性化音樂 這個所謂的個性化的音樂就是指你輸入一段文字它會根據這個文字輸出一段音樂這個音樂是貼近于那段文字的所以叫做文生成音樂, 如果網絡正常的話就可以直接從下載這個模型。 那么音樂生成的有兩種方式呢有兩種方式&#xff…

【C++初階】C/C++內存管理

【C初階】C/C內存管理 🥕個人主頁:開敲🍉 🔥所屬專欄:C🥭 🌼文章目錄🌼 1. C/C內存分布 2. C語言中動態內存管理方式:malloc/calloc/realloc/free 3. C內存管理方式 3…

DP學習——組合模式

學而時習之,溫故而知新。 組合模式 和代理模式相比 和代理模式相比,有點類似。引用類和被引用類都繼承于同一個接口類。 但是感覺組合模式是對代理模式的更加豐富化(升級版、超進化),集合化或者說聚合化。 組合模…

拉格朗日乘子法和KKT條件

拉格朗日乘子法(Lagrange Multiplier) 和 KKT(Karush-Kuhn-Tucker) 條件是求解約束優化問題的重要方法,在有等式約束時使用拉格朗日乘子法,在有不等約束時使用 KKT 條件。當然,這兩個方法求得的結果只是必要條件,只有當目標函數…

ssrf復習(及ctfshow351-360)

1. SSRF 概述 服務器會根據用戶提交的URL發送一個HTTP請求。使用用戶指定的URL,Web應用可以獲取圖片或者文件資源等。典型的例子是百度識圖功能。 如果沒有對用戶提交URL和遠端服務器所返回的信息做合適的驗證或過濾,就有可能存在“請求偽造"的缺陷…

C#中錯誤與異常處理

1、錯誤和異常 如果程序運行期間發生錯誤,異常就會發生。異常會中止當前的程序流,如果不采取措施,程序將停止運行。 錯誤和異常是兩個不同的概念,但它們都與程序的穩定性和可維護性有關。 1.1、錯誤 錯誤通常是指編譯時的語法錯誤…

FPGA學習筆記(一) FPGA最小系統

文章目錄 前言一、FPGA最小系統總結 前言 今天學習下FPGA的最小系統一、FPGA最小系統 FPGA最小系統與STM32最小系統類似,由供電電源,時鐘電路晶振,復位和調試接口JTAG以及FLASH配置芯片組成,其與STM32最大的不同之處就是必須要有…

關于Hyperf高并發性能的一些配置詳解和硬件推薦

目錄 工作進程的管理 自定義配置示例(EasySwoole): 自動生成: 結論: 集群部署與協程數的關系: 設置 max_coroutine 的考慮因素: 集群部署時的配置: 示例配置: C…

鏈表面試練習習題集(Java)

1. 思路&#xff1a; 因為楊輝三角是由二維數組構成&#xff0c;所以要先創建一個二維數組&#xff0c;如何用順序表表示二維數組&#xff0c;可以通過List<List<Interger>>來表示一個二維數組&#xff0c;可以這樣理解&#xff1a;先創建一個一維數組List&#x…

modbus slave 設備通過 網關thingsboard-gateway 將數據上傳到thingsboard云平臺

搭建thingsboard物聯網云平臺花了大量時間&#xff0c;從小白到最后搭建成功&#xff0c;折磨了好幾天&#xff0c;也感謝網友的幫助&#xff0c;提供了思路最終成功搞定&#xff0c;特此記錄。 一、thingsboard環境搭建&#xff08;Ubuntu20.04LTS&#xff09; 參考官方文檔&a…

java之 junit單元測試案例【經典版】

一 junit單元測試 1.1 單元測試作用 單元測試要滿足AIR原則&#xff0c;即 A&#xff1a; automatic 自動化&#xff1b; I: Independent 獨立性&#xff1b; R&#xff1a;Repeatable 可重復&#xff1b; 2.單元測試必須使用assert來驗證 1.2 案例1 常規單元測試 1.…

PSINS工具箱函數介紹——r2d

介紹工具箱里面r2d這個小函數的作用。 程序源碼 function deg r2d(rad) % Convert angle unit from radian to degree % % Prototype: deg r2d(rad) % Input: rad - angle in radian(s) % Output: deg - angle in degree(s) % % See also r2dm, r2dms, d2r, dm2r, dms2r% …

設計模式使用場景實現示例及優缺點(行為型模式——觀察者模式)

阿爾法的身體內部有一個智能芯片&#xff0c;這個芯片能夠根據環境和需求自動改變它的行為模式。當阿爾法需要完成不同任務時&#xff0c;它的內部狀態會發生變化&#xff0c;進而改變它的行為&#xff0c;就像是它變成了另一個機器人一樣。 一天&#xff0c;智能城的市長接到一…

多種方式實現 元素高度絲滑的從0-1顯示出來

選擇合適的方式&#xff0c;給用戶更好的體驗&#xff0c;多種方式實現 元素高度絲滑的從0-1顯示出來。 能用 CSS 實現的動畫&#xff0c;就不要采用 JS 去實現。 1、瀏覽器可以對CSS動畫進行優化&#xff0c;其優化原理類似于requestAnimationFrame&#xff0c;會把每一幀的…