最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python 實現(xiàn)子類獲取父類的類成員方法

 更新時間:2019年01月11日 14:41:37   作者:matdodo  
今天小編就為大家分享一篇Python 實現(xiàn)子類獲取父類的類成員方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

大家好,今天在寫代碼的時候,遇到了這樣一種情況。我有如下所示的幾個類用來存放程序配置(其實當做命名空間來用,同時感覺能夠繼承方便一點),

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

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

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

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

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

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

@Python Yiyi

利用Python3 metaclass 實現(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 語言參考中描述:

當執(zhí)行類定義時,將執(zhí)行以下步驟:

確定正確的元類

準備類的命名空間

執(zhí)行類的主體

創(chuàng)建類對象

3.3.3.1. 確定正確的元類

3.3.3.2. 準備類的命名空間

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

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

3.3.3.3. 執(zhí)行類的主體

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

3.3.3.4. 創(chuàng)建類對象

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

以上這篇Python 實現(xiàn)子類獲取父類的類成員方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 深度解讀Python如何實現(xiàn)dbscan算法

    深度解讀Python如何實現(xiàn)dbscan算法

    DBScan?是密度基于空間聚類,它是一種基于密度的聚類算法,其與其他聚類算法(如K-Means)不同的是,它不需要事先知道簇的數(shù)量。本文就來帶大家了解一下Python是如何實現(xiàn)dbscan算法,感興趣的可以了解一下
    2023-02-02
  • Python裝飾器重載內(nèi)置的使用

    Python裝飾器重載內(nèi)置的使用

    本文主要介紹了Python裝飾器重載內(nèi)置的使用,詳細介紹如何創(chuàng)建裝飾器,如何使用裝飾器來重載內(nèi)置函數(shù),具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • 學(xué)習(xí)Python能用來做什么的問題

    學(xué)習(xí)Python能用來做什么的問題

    這篇文章主要介紹了關(guān)于Python能用來做什么的問題,如果你想學(xué)Python,或者你剛開始學(xué)習(xí)Python,那么你可能會問:我能用Python做什么?下面就讓我們一起來看看吧
    2023-04-04
  • Python異步處理返回進度——使用Flask實現(xiàn)進度條

    Python異步處理返回進度——使用Flask實現(xiàn)進度條

    這篇文章主要介紹了Python異步處理返回進度——使用Flask實現(xiàn)進度條,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • 基于Python獲取照片的GPS位置信息

    基于Python獲取照片的GPS位置信息

    這篇文章主要介紹了基于Python獲取照片的GPS位置信息,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-01-01
  • 用Python采集《雪中悍刀行》彈幕做成詞云實例

    用Python采集《雪中悍刀行》彈幕做成詞云實例

    大家好,本篇文章主要講的是用Python采集《雪中悍刀行》彈幕做成詞云實例,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • python去掉空白行的多種實現(xiàn)代碼

    python去掉空白行的多種實現(xiàn)代碼

    這篇文章主要介紹了python去掉空白行實現(xiàn)代碼,需要的朋友可以參考下
    2018-03-03
  • 如何利用Python實現(xiàn)自動打卡簽到的實踐

    如何利用Python實現(xiàn)自動打卡簽到的實踐

    簽到,都是規(guī)律性的操作,何嘗不寫一個程序加到Windows實現(xiàn)自動簽到呢,本文就主要介紹了如何利用Python實現(xiàn)自動打卡簽到的實踐,具有一定的參考價值,感興趣的可以了解一下
    2021-12-12
  • Python 實現(xiàn)訓(xùn)練集、測試集隨機劃分

    Python 實現(xiàn)訓(xùn)練集、測試集隨機劃分

    今天小編就為大家分享一篇Python 實現(xiàn)訓(xùn)練集、測試集隨機劃分,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • Python Socket編程實現(xiàn)猜數(shù)字游戲交互體驗

    Python Socket編程實現(xiàn)猜數(shù)字游戲交互體驗

    當利用Python的Socket編程創(chuàng)建一個猜數(shù)字游戲時,需要分別實現(xiàn)服務(wù)器端和客戶端的邏輯,本文將詳細描述這兩個部分的功能和代碼片段
    2024-01-01

最新評論

阜宁县| 观塘区| 黄骅市| 云和县| 永嘉县| 安新县| 琼海市| 江达县| 即墨市| 金华市| 久治县| 遂溪县| 东乡族自治县| 准格尔旗| 南木林县| 日土县| 东方市| 道真| 凤山县| 开原市| 庆安县| 松江区| 高淳县| 灌云县| 滨州市| 东源县| 泸西县| 沂南县| 措勤县| 普定县| 济阳县| 张家口市| 健康| 澄城县| 邓州市| 清徐县| 冕宁县| 新民市| 阿克陶县| 太保市| 建瓯市|