Python 实现子类获取父类的类成员方法


Posted in Python onJanuary 11, 2019

大家好,今天在写代码的时候,遇到了这样一种情况。我有如下所示的几个类用来存放程序配置(其实当做命名空间来用,同时感觉能够继承方便一点),

import os
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 实现子类获取父类的类成员方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python类定义和类继承详解
May 08 Python
python中函数总结之装饰器闭包详解
Jun 12 Python
python实现猜数字小游戏
Mar 24 Python
用pycharm开发django项目示例代码
Oct 24 Python
纯用NumPy实现神经网络的示例代码
Oct 24 Python
在python中实现将一张图片剪切成四份的方法
Dec 05 Python
python搜索包的路径的实现方法
Jul 19 Python
Python 根据日志级别打印不同颜色的日志的方法示例
Aug 08 Python
将labelme格式数据转化为标准的coco数据集格式方式
Feb 17 Python
Python 解析简单的XML数据
Jul 24 Python
python实现简单的tcp 文件下载
Sep 16 Python
python3代码输出嵌套式对象实例详解
Dec 03 Python
python使用xlrd模块读取xlsx文件中的ip方法
Jan 11 #Python
python远程调用rpc模块xmlrpclib的方法
Jan 11 #Python
解决PySide+Python子线程更新UI线程的问题
Jan 11 #Python
python PrettyTable模块的安装与简单应用
Jan 11 #Python
对python多线程中互斥锁Threading.Lock的简单应用详解
Jan 11 #Python
pyqt5实现俄罗斯方块游戏
Jan 11 #Python
python之线程通过信号pyqtSignal刷新ui的方法
Jan 11 #Python
You might like
PHP session有效期问题
2009/04/26 PHP
关于PHP转换超过2038年日期出错的问题解决
2017/06/28 PHP
用javascript实现的仿Flash广告图片轮换效果
2007/04/24 Javascript
实现变速回到顶部的JavaScript代码
2011/05/09 Javascript
Jquery图形报表插件 jqplot简介及参数详解
2012/10/10 Javascript
Google Map V3 绑定气泡窗口(infowindow)Dom事件实现代码
2013/04/26 Javascript
jQuery移动端日期(datedropper)和时间(timedropper)选择器附源码下载
2016/04/19 Javascript
jQuery.datatables.js插件用法及api实例详解
2016/10/28 Javascript
jQuery validate 验证radio实例
2017/03/01 Javascript
Angularjs过滤器实现动态搜索与排序功能示例
2017/12/13 Javascript
Vuex 快速入门(简单易懂)
2018/09/20 Javascript
js实现点赞效果
2020/03/16 Javascript
vue组件开发之slider组件使用详解
2020/08/21 Javascript
[48:48]VGJ.T vs Liquid 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python map和reduce函数用法示例
2015/02/26 Python
让python在hadoop上跑起来
2016/01/27 Python
微信 用脚本查看是否被微信好友删除
2016/10/28 Python
Python查找两个有序列表中位数的方法【基于归并算法】
2018/04/20 Python
pandas DataFrame 根据多列的值做判断,生成新的列值实例
2018/05/18 Python
Python 读取用户指令和格式化打印实现解析
2019/09/02 Python
django drf框架自带的路由及最简化的视图
2019/09/10 Python
Python实现图片识别加翻译功能
2019/12/26 Python
pytorch 获取tensor维度信息示例
2020/01/03 Python
Python3.9又更新了:dict内置新功能
2020/02/28 Python
如何通过python检查文件是否被占用
2020/12/18 Python
Python Selenium异常处理的实例分析
2021/02/28 Python
html Table 表头固定的实现
2019/01/22 HTML / CSS
怎样有效的进行自我评价
2013/10/06 职场文书
公司中秋节活动方案
2014/02/12 职场文书
法人委托书范本
2014/09/15 职场文书
晚会闭幕词
2015/01/28 职场文书
刮痧观后感
2015/06/05 职场文书
实习报告怎么写
2019/06/20 职场文书
解决Python中的modf()函数取小数部分不准确问题
2021/05/28 Python
使用Python的开发框架Brownie部署以太坊智能合约
2021/05/28 Python
ORACLE数据库应用开发的三十个注意事项
2021/06/07 Oracle