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基于sftp及rsa密匙实现远程拷贝文件的方法
Sep 21 Python
Python实现合并两个列表的方法分析
May 28 Python
Python数据可视化库seaborn的使用总结
Jan 15 Python
python输入多行字符串的方法总结
Jul 02 Python
Python3中的最大整数和最大浮点数实例
Jul 09 Python
PyTorch和Keras计算模型参数的例子
Jan 02 Python
pytorch 改变tensor尺寸的实现
Jan 03 Python
python__new__内置静态方法使用解析
Jan 07 Python
Django ValuesQuerySet转json方式
Mar 16 Python
python简单实现9宫格图片实例
Sep 03 Python
在pycharm创建scrapy项目的实现步骤
Dec 01 Python
Python+Matplotlib图像上指定坐标的位置添加文本标签与注释
Apr 11 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 Undefined index和Undefined variable的解决方法
2008/03/27 PHP
PHP的APC模块实现上传进度条
2015/10/27 PHP
php入门教程之Zend Studio设置与开发实例
2016/09/09 PHP
Yii实现复选框批量操作实例代码
2017/03/15 PHP
php实现简单的守护进程创建、开启与关闭操作
2019/08/13 PHP
JS 如何获取radio选中后的值及不选择取radio的值
2013/10/28 Javascript
js输出阴历、阳历、年份、月份、周示例代码
2014/01/29 Javascript
js实现用户注册协议倒计时的方法
2015/01/21 Javascript
浅谈JavaScript数据类型
2015/03/03 Javascript
JavaScript实现函数返回多个值的方法
2015/06/09 Javascript
JS实现从网页顶部掉下弹出层效果的方法
2015/08/06 Javascript
JS实现的鼠标跟随代码(卡通手型点击效果)
2015/10/26 Javascript
Javascript中内建函数reduce的应用详解
2016/10/20 Javascript
jquery 正整数数字校验正则表达式
2017/01/10 Javascript
javascript实现延时显示提示框效果
2017/06/01 Javascript
Vue封装Swiper实现图片轮播效果
2018/02/06 Javascript
详解如何配置vue-cli3.0的vue.config.js
2018/08/23 Javascript
小程序实现搜索框功能
2020/03/26 Javascript
layui table设置某一行的字体颜色方法
2019/09/05 Javascript
使用JavaScript通过前端发送电子邮件
2020/05/22 Javascript
python实现udp数据报传输的方法
2014/09/26 Python
python BeautifulSoup设置页面编码的方法
2015/04/03 Python
老生常谈Python基础之字符编码
2017/06/14 Python
python3利用ctypes传入一个字符串类型的列表方法
2019/02/12 Python
从0开始的Python学习014面向对象编程(推荐)
2019/04/02 Python
Pycharm 文件更改目录后,执行路径未更新的解决方法
2019/07/19 Python
Python多线程Threading、子线程与守护线程实例详解
2020/03/24 Python
three.js模拟实现太阳系行星体系功能
2019/09/03 HTML / CSS
大学生毕业自我鉴定
2013/11/06 职场文书
校园报刊亭创业计划书
2014/01/02 职场文书
项目合作计划书
2014/01/09 职场文书
二年级小学生评语
2014/04/21 职场文书
我的大学四年规划书范文2014
2014/09/26 职场文书
社区植树节活动总结
2015/02/06 职场文书
SQL实现LeetCode(177.第N高薪水)
2021/08/04 MySQL
golang生成并解析JSON
2022/04/14 Golang