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之import机制详解
Jul 03 Python
Python中title()方法的使用简介
May 20 Python
深入解析Python中的__builtins__内建对象
Jun 21 Python
vue.js实现输入框输入值内容实时响应变化示例
Jul 07 Python
浅谈利用numpy对矩阵进行归一化处理的方法
Jul 11 Python
使用Python处理BAM的方法
Sep 28 Python
pytorch打印网络结构的实例
Aug 19 Python
python 给图像添加透明度(alpha通道)
Apr 09 Python
Python爬取网页信息的示例
Sep 24 Python
Python批量修改xml的坐标值全部转为整数的实例代码
Nov 26 Python
10个python爬虫入门基础代码实例 + 1个简单的python爬虫完整实例
Dec 16 Python
python绘制箱型图
Apr 27 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
yii框架中的Url生产问题小结
2012/01/16 PHP
PHP 利用AJAX获取网页并输出的实现代码(Zjmainstay)
2012/08/31 PHP
php顺序查找和二分查找示例
2014/03/27 PHP
PHP PDO数据库操作预处理与注意事项
2019/03/16 PHP
ymPrompt的doHandler方法来实现获取子窗口返回值的方法
2010/06/25 Javascript
javascript阻止scroll事件多次执行的思路及实现
2013/11/08 Javascript
利用javascript判断文件是否存在
2013/12/31 Javascript
jquery淡化版banner异步图片文字效果切换图片特效
2014/04/08 Javascript
22点关于jquery性能优化的建议
2014/05/28 Javascript
jquery实现的下拉和收缩效果示例
2014/08/21 Javascript
JQuery统计input和textarea文字输入数量(代码分享)
2016/12/29 Javascript
angular+ionic 的app上拉加载更新数据实现方法
2017/01/16 Javascript
利用JS实现简单的日期选择插件
2017/01/23 Javascript
JS实现获取图片大小和预览的方法完整实例【兼容IE和其它浏览器】
2017/04/24 Javascript
JS中的三个循环小结
2017/06/20 Javascript
基于jstree使用AJAX请求获取数据形成树
2017/08/29 Javascript
原生js检测页面加载完毕的实例
2018/09/11 Javascript
基于vue-cli搭建多模块且各模块独立打包的项目
2019/06/12 Javascript
Python matplotlib画图实例之绘制拥有彩条的图表
2017/12/28 Python
Tensorflow 合并通道及加载子模型的方法
2018/07/26 Python
python随机数分布random测试
2018/08/27 Python
python scipy卷积运算的实现方法
2019/09/16 Python
Python socket模块方法实现详解
2019/11/05 Python
纯CSS3实现鼠标悬停提示气泡效果
2014/02/28 HTML / CSS
HTML+CSS3+JS 实现的下拉菜单
2020/11/25 HTML / CSS
亚瑟士美国官网:ASICS美国
2017/02/01 全球购物
L’AGENCE官网:加州女装品牌
2018/06/03 全球购物
荷兰最大的儿童服装店:The Kids Republic
2019/04/13 全球购物
alice McCALL官网:澳大利亚时尚品牌
2020/11/16 全球购物
哥伦比亚加拿大官网:Columbia Sportswear Canada
2020/09/07 全球购物
大一自我鉴定范文
2013/12/27 职场文书
2015年人事工作总结范文
2015/04/09 职场文书
物资采购管理制度
2015/08/06 职场文书
党校培训学习心得体会
2016/01/06 职场文书
Go语言基础map用法及示例详解
2021/11/17 Golang
MySQL中order by的执行过程
2022/06/05 MySQL