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实现计算文件夹下.h和.cpp文件的总行数
Apr 23 Python
举例讲解Python中的算数运算符的用法
May 13 Python
在windows系统中实现python3安装lxml
Mar 23 Python
Python端口扫描简单程序
Nov 10 Python
python虚拟环境virualenv的安装与使用
Dec 18 Python
Python实现通过文件路径获取文件hash值的方法
Apr 29 Python
Python决策树之基于信息增益的特征选择示例
Jun 25 Python
Windows系统下PhantomJS的安装和基本用法
Oct 21 Python
python3.6环境安装+pip环境配置教程图文详解
Jun 20 Python
python实现批量nii文件转换为png图像
Jul 18 Python
python进度条显示之tqmd模块
Aug 22 Python
如何通过python检查文件是否被占用
Dec 18 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之第六天
2006/10/09 PHP
ASP和PHP都是可以删除自身的
2007/04/09 PHP
MySQL修改密码方法总结
2008/03/25 PHP
PHP后台备份MySQL数据库的源码实例
2019/03/18 PHP
js精度溢出解决方案
2012/12/02 Javascript
js数组与字符串的相互转换方法
2014/07/09 Javascript
基于javascript实现图片懒加载
2016/01/05 Javascript
jquery ajax结合thinkphp的getjson实现跨域的方法
2016/06/06 Javascript
KnockoutJS 3.X API 第四章之事件event绑定
2016/10/10 Javascript
vue.js学习笔记:如何加载本地json文件
2017/01/17 Javascript
javascript表单正则应用
2017/02/04 Javascript
一道面试题引发的对javascript类型转换的思考
2017/03/06 Javascript
Vuex模块化实现待办事项的状态管理
2017/03/15 Javascript
vue2.0结合DataTable插件实现表格动态刷新的方法详解
2017/03/17 Javascript
jQuery插件FusionCharts绘制的3D双柱状图效果示例【附demo源码】
2017/04/20 jQuery
vue实现导航栏效果(选中状态刷新不消失)
2017/12/13 Javascript
JS构造一个html文本内容成文件流形式发送到后台
2018/07/31 Javascript
vue+VeeValidate 校验范围实例详解(部分校验,全部校验)
2018/10/19 Javascript
jquery实现动态改变css样式的方法分析
2019/05/27 jQuery
python3访问sina首页中文的处理方法
2014/02/24 Python
Python argv用法详解
2016/01/08 Python
Python爬取qq music中的音乐url及批量下载
2017/03/23 Python
python学习之matplotlib绘制散点图实例
2017/12/09 Python
答题辅助python代码实现
2018/01/16 Python
Python使用Shelve保存对象方法总结
2019/01/28 Python
python中的&&及||的实现示例
2019/08/07 Python
CSS3毛玻璃效果(blur)有白边问题的解决方法
2016/11/15 HTML / CSS
Gloeilampgoedkoop荷兰:在线购买灯泡
2019/02/16 全球购物
PHP如何防止SQL注入
2014/05/03 面试题
护理专业学生的求职信范文
2013/12/11 职场文书
秋天的雨教学反思
2014/04/27 职场文书
仓库规划计划书
2014/04/28 职场文书
室内趣味活动方案
2014/08/24 职场文书
防灾减灾日活动总结
2014/08/26 职场文书
2014大四本科生自我鉴定总结
2014/10/04 职场文书
2015年技术员工作总结
2015/04/10 职场文书