亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python如何實現子類獲取父類的類成員方法

發布時間:2021-04-26 10:41:00 來源:億速云 閱讀:409 作者:小新 欄目:開發技術

這篇文章給大家分享的是有關Python如何實現子類獲取父類的類成員方法的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

python有哪些常用庫

python常用的庫:1.requesuts;2.scrapy;3.pillow;4.twisted;5.numpy;6.matplotlib;7.pygama;8.ipyhton等。

class Config:
BASE_DIR = "/tmp"
class TestConfig(Config):
DATA_DIR = os.path.join(Config.BASE_DIR, "data")

然后我在子類中想要訪問父類的類成員變量,而且這兩個類都是只有類成員變量。感覺目前我使用的方法笨一點,就是直接引用父類的名字,感覺這樣的方法不靈活,我想找一種方法,可以讓子類訪問到父類。

我在網上搜索了一下,找了這么兩種方法,但是感覺都不怎么符合我的需求:

1. 在子類方法中調用super(TestConfig, self)來獲取父類(我的類只有類成員變量,沒有self)

2. 通過子類的名字SubConfig.__bases__來獲取父類(我是在SubConfing這個子類內部執行相關語句的,會拋出SubConfig還未定義的NameError)

然后就沒有找到其他的辦法了,所以想來和大家請教一下,像我這種想法,有辦法可以實現嗎?應該怎么做啊?這個問題問的可能比較傻,還請大家不要見怪。

@Python Yiyi

利用Python3 metaclass 實現

>>> import os
>>> class M(type):
	@classmethod
	def __prepare__(metacls, name, bases, **kwds):
		d = dict()
		for base in bases:
			for key, value in base.__dict__.items():
				if not key.startswith('_'):
					d[key] = value
		return d
	def __new__(cls, name, bases, namespace, **kwds):
		for base in bases:
			for key, value in base.__dict__.items():
				if not key.startswith('_'):
				  del namespace[key]
		return type.__new__(cls, name, bases, dict(namespace))
 
	
>>> class Config(metaclass=M):
	BASE_DIR = "/tmp"
 
	
>>> class TestConfig(Config):
	DATA_DIR = os.path.join(BASE_DIR, "data")
 
	
>>> TestConfig.DATA_DIR
'/tmp\\data'
>>> 
>>> TestConfig.__dict__
mappingproxy({'__doc__': None, '__module__': '__main__', 'DATA_DIR': '/tmp\\data'})
>>>

附上上述代碼的解釋,基本都來自于Python 語言參考中描述:

當執行類定義時,將執行以下步驟:

確定正確的元類

準備類的命名空間

執行類的主體

創建類對象

3.3.3.1. 確定正確的元類

3.3.3.2. 準備類的命名空間

確定正確的元類后,則開始準備類的命名空間。如果元類具有__prepare__屬性,那么它以namespace = metaclass.__prepare__(name, bases, **kwds)形式調用(其中如果有額外的關鍵字參數,那么它們來自類的定義)。

如果元類沒有__prepare__屬性,那么類的命名空間初始化一個空的dict()實例。

3.3.3.3. 執行類的主體

類的主體(大體上)以exec(body, globals(), namespace)的方式執行。(從這里可以看出,BASE_DIR找不到的原因是globals() 和namespace 中沒有BASE_DIR定義。解決辦法是將基類的成員拷貝到namespace中)

3.3.3.4. 創建類對象

類的命名空間通過執行類的主體創建完之后,通過調用metaclass(name, bases, namespace, **kwds)創建類對象(這里傳遞過來的額外的關鍵字參數與傳遞給__prepare__的相同)。

感謝各位的閱讀!關于“Python如何實現子類獲取父類的類成員方法”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

顺昌县| 金昌市| 微山县| 仪征市| 临漳县| 西青区| 塘沽区| 绥阳县| 定边县| 申扎县| 临江市| 孝感市| 都安| 屏南县| 玛纳斯县| 崇仁县| 江城| 清苑县| 大连市| 昭平县| 乡城县| 鹿泉市| 古交市| 青阳县| 长子县| 印江| 高邑县| 大冶市| 怀宁县| 永定县| 文化| 大英县| 都昌县| 勃利县| 新营市| 湘西| 瑞金市| 彰化县| 信阳市| 本溪| 泰宁县|