国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Python > 正文

Python 實(shí)現(xiàn)子類(lèi)獲取父類(lèi)的類(lèi)成員方法

2020-02-16 00:36:30
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

大家好,今天在寫(xiě)代碼的時(shí)候,遇到了這樣一種情況。我有如下所示的幾個(gè)類(lèi)用來(lái)存放程序配置(其實(shí)當(dāng)做命名空間來(lái)用,同時(shí)感覺(jué)能夠繼承方便一點(diǎn)),

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

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

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

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

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

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

@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'})>>> 

附上上述代碼的解釋?zhuān)径紒?lái)自于Python 語(yǔ)言參考中描述:

當(dāng)執(zhí)行類(lèi)定義時(shí),將執(zhí)行以下步驟:

確定正確的元類(lèi)

準(zhǔn)備類(lèi)的命名空間

執(zhí)行類(lèi)的主體

創(chuàng)建類(lèi)對(duì)象

3.3.3.1. 確定正確的元類(lèi)

3.3.3.2. 準(zhǔn)備類(lèi)的命名空間

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

如果元類(lèi)沒(méi)有__prepare__屬性,那么類(lèi)的命名空間初始化一個(gè)空的dict()實(shí)例。

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

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

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 内江市| 凤山市| 闽侯县| 报价| 洛阳市| 梁河县| 兴义市| 武汉市| 丁青县| 房山区| 安吉县| 萍乡市| 南康市| 长治市| 哈巴河县| 城固县| 阳新县| 甘肃省| 盐津县| 岱山县| 台南县| 衢州市| 怀远县| 双柏县| 肇州县| 苏尼特右旗| 兴隆县| 临漳县| 龙游县| 辽宁省| 青阳县| 镇安县| 枣庄市| 北海市| 绍兴县| 陆川县| 万山特区| 靖安县| 额尔古纳市| 黑龙江省| 六安市|