Python 實(shí)現(xiàn)子類獲取父類的類成員方法
大家好,今天在寫代碼的時(shí)候,遇到了這樣一種情況。我有如下所示的幾個(gè)類用來存放程序配置(其實(shí)當(dāng)做命名空間來用,同時(shí)感覺能夠繼承方便一點(diǎn)),
import os class Config: BASE_DIR = "/tmp" class TestConfig(Config): DATA_DIR = os.path.join(Config.BASE_DIR, "data")
然后我在子類中想要訪問父類的類成員變量,而且這兩個(gè)類都是只有類成員變量。感覺目前我使用的方法笨一點(diǎn),就是直接引用父類的名字,感覺這樣的方法不靈活,我想找一種方法,可以讓子類訪問到父類。
我在網(wǎng)上搜索了一下,找了這么兩種方法,但是感覺都不怎么符合我的需求:
1. 在子類方法中調(diào)用super(TestConfig, self)來獲取父類(我的類只有類成員變量,沒有self)
2. 通過子類的名字SubConfig.__bases__來獲取父類(我是在SubConfing這個(gè)子類內(nèi)部執(zhí)行相關(guān)語句的,會(huì)拋出SubConfig還未定義的NameError)
然后就沒有找到其他的辦法了,所以想來和大家請(qǐng)教一下,像我這種想法,有辦法可以實(shí)現(xiàn)嗎?應(yīng)該怎么做啊?這個(gè)問題問的可能比較傻,還請(qǐng)大家不要見怪。
@Python Yiyi
利用Python3 metaclass 實(shí)現(xiàn)
>>> 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 語言參考中描述:
當(dāng)執(zhí)行類定義時(shí),將執(zhí)行以下步驟:
確定正確的元類
準(zhǔn)備類的命名空間
執(zhí)行類的主體
創(chuàng)建類對(duì)象
3.3.3.1. 確定正確的元類
3.3.3.2. 準(zhǔn)備類的命名空間
確定正確的元類后,則開始準(zhǔn)備類的命名空間。如果元類具有__prepare__屬性,那么它以namespace = metaclass.__prepare__(name, bases, **kwds)形式調(diào)用(其中如果有額外的關(guān)鍵字參數(shù),那么它們來自類的定義)。
如果元類沒有__prepare__屬性,那么類的命名空間初始化一個(gè)空的dict()實(shí)例。
3.3.3.3. 執(zhí)行類的主體
類的主體(大體上)以exec(body, globals(), namespace)的方式執(zhí)行。(從這里可以看出,BASE_DIR找不到的原因是globals() 和namespace 中沒有BASE_DIR定義。解決辦法是將基類的成員拷貝到namespace中)
3.3.3.4. 創(chuàng)建類對(duì)象
類的命名空間通過執(zhí)行類的主體創(chuàng)建完之后,通過調(diào)用metaclass(name, bases, namespace, **kwds)創(chuàng)建類對(duì)象(這里傳遞過來的額外的關(guān)鍵字參數(shù)與傳遞給__prepare__的相同)。
以上這篇Python 實(shí)現(xiàn)子類獲取父類的類成員方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
深度解讀Python如何實(shí)現(xiàn)dbscan算法
DBScan?是密度基于空間聚類,它是一種基于密度的聚類算法,其與其他聚類算法(如K-Means)不同的是,它不需要事先知道簇的數(shù)量。本文就來帶大家了解一下Python是如何實(shí)現(xiàn)dbscan算法,感興趣的可以了解一下2023-02-02
Python異步處理返回進(jìn)度——使用Flask實(shí)現(xiàn)進(jìn)度條
這篇文章主要介紹了Python異步處理返回進(jìn)度——使用Flask實(shí)現(xiàn)進(jìn)度條,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05
如何利用Python實(shí)現(xiàn)自動(dòng)打卡簽到的實(shí)踐
簽到,都是規(guī)律性的操作,何嘗不寫一個(gè)程序加到Windows實(shí)現(xiàn)自動(dòng)簽到呢,本文就主要介紹了如何利用Python實(shí)現(xiàn)自動(dòng)打卡簽到的實(shí)踐,具有一定的參考價(jià)值,感興趣的可以了解一下2021-12-12
Python 實(shí)現(xiàn)訓(xùn)練集、測(cè)試集隨機(jī)劃分
今天小編就為大家分享一篇Python 實(shí)現(xiàn)訓(xùn)練集、測(cè)試集隨機(jī)劃分,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-01-01
Python Socket編程實(shí)現(xiàn)猜數(shù)字游戲交互體驗(yàn)
當(dāng)利用Python的Socket編程創(chuàng)建一個(gè)猜數(shù)字游戲時(shí),需要分別實(shí)現(xiàn)服務(wù)器端和客戶端的邏輯,本文將詳細(xì)描述這兩個(gè)部分的功能和代碼片段2024-01-01

