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 中文乱码问题深入分析
Mar 13 Python
Python面向对象之继承和组合用法实例分析
Aug 27 Python
Python闭包思想与用法浅析
Dec 27 Python
python 实现在tkinter中动态显示label图片的方法
Jun 13 Python
Python爬虫 bilibili视频弹幕提取过程详解
Jul 31 Python
基于python实现的百度音乐下载器python pyqt改进版(附代码)
Aug 05 Python
python输出数组中指定元素的所有索引示例
Dec 06 Python
解决pycharm安装第三方库失败的问题
May 09 Python
浅谈python量化 双均线策略(金叉死叉)
Jun 03 Python
浅谈keras 的抽象后端(from keras import backend as K)
Jun 16 Python
python 写一个水果忍者游戏
Jan 13 Python
如何通过一篇文章了解Python中的生成器
Apr 02 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中的正则表达式函数介绍
2012/02/27 PHP
PHP类与对象中的private访问控制的疑问
2012/11/01 PHP
php class中self,parent,this的区别以及实例介绍
2013/04/24 PHP
PHP中的静态变量及static静态变量使用详解
2015/11/05 PHP
分享五个PHP7性能优化提升技巧
2015/12/07 PHP
thinkPHP5项目中实现QQ第三方登录功能
2017/10/20 PHP
PHP上传文件及图片到七牛的方法
2018/07/25 PHP
PHP图像处理技术实例总结【绘图、水印、验证码、图像压缩】
2018/12/08 PHP
PHP 实现文件压缩解压操作的方法
2019/06/14 PHP
Jquery Ajax学习实例5 向WebService发出请求,返回泛型集合数据的异步调用
2010/03/17 Javascript
js内置对象 学习笔记
2011/08/01 Javascript
页面右下角弹出提示框示例代码js版
2013/08/02 Javascript
返回页面顶部top按钮通过锚点实现(自写)
2013/08/30 Javascript
jquery插件开发之实现md5插件
2014/03/17 Javascript
Jqgrid之强大的表格插件应用
2015/12/02 Javascript
JS判断日期格式是否合法的简单实例
2016/07/11 Javascript
JS请求servlet功能示例
2017/06/01 Javascript
浅谈Vue响应式(数组变异方法)
2018/05/07 Javascript
详解vue 数组和对象渲染问题
2018/09/21 Javascript
jQuery内容过滤选择器与子元素过滤选择器用法实例分析
2019/02/20 jQuery
js+html实现周岁年龄计算器
2019/06/25 Javascript
NProgress显示顶部进度条效果及使用详解
2019/09/21 Javascript
HTML+JS实现“代码雨”效果源码(黑客帝国文字下落效果)
2020/03/17 Javascript
selenium跳过webdriver检测并模拟登录淘宝
2019/06/12 Python
Python OpenCV实现鼠标画框效果
2020/08/19 Python
戴尔英国官网:Dell英国
2017/05/27 全球购物
实习护理工作自我评价
2013/09/25 职场文书
公司委托书范本
2014/04/04 职场文书
纪检干部先进事迹材料
2014/08/23 职场文书
党支部创先争优活动总结
2014/08/28 职场文书
法人代表授权委托书范文
2014/09/10 职场文书
考试作弊检讨书1000字(5篇)
2014/10/19 职场文书
监察建议书
2015/02/04 职场文书
php双向队列实例讲解
2021/11/17 PHP
mysql中如何用命令创建联合唯一索引
2022/04/20 MySQL
mysql中关键词exists的用法实例详解
2022/06/10 MySQL