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正则表达式及使用正则表达式的例子
Jan 22 Python
Python实现批量压缩图片
Jan 25 Python
python pandas中DataFrame类型数据操作函数的方法
Apr 08 Python
Python实现的根据文件名查找数据文件功能示例
May 02 Python
python字符串和常用数据结构知识总结
May 21 Python
Python的log日志功能及设置方法
Jul 11 Python
django 2.2和mysql使用的常见问题
Jul 18 Python
python3.7实现云之讯、聚合短信平台的短信发送功能
Sep 26 Python
wxPython:python首选的GUI库实例分享
Oct 05 Python
如何在sublime编辑器中安装python
May 20 Python
pandas之分组groupby()的使用整理与总结
Jun 18 Python
Python Tkinter实例——模拟掷骰子
Oct 24 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计数器的实现代码
2013/06/08 PHP
PHP中Session引起的脚本阻塞问题解决办法
2014/04/08 PHP
php实现scws中文分词搜索的方法
2015/12/25 PHP
执行iframe中的javascript方法
2008/10/07 Javascript
菜鸟javascript基础资料整理2
2010/12/06 Javascript
Javascript实现关联数据(Linked Data)查询及注意细节
2013/02/22 Javascript
解析javascript 数组以及json元素的添加删除
2013/06/26 Javascript
js(jQuery)获取时间的方法及常用时间类搜集
2013/10/23 Javascript
JS中prototype的用法实例分析
2015/03/19 Javascript
在Node.js中使用HTTP上传文件的方法
2015/06/23 Javascript
JavaScript模拟鼠标右键菜单效果
2020/12/08 Javascript
React如何避免重渲染
2018/04/10 Javascript
js实现固定区域内的不重叠随机圆
2019/10/24 Javascript
js防抖函数和节流函数使用场景和实现区别示例分析
2020/04/11 Javascript
javascript操作向表格中动态加载数据
2020/08/27 Javascript
python在多玩图片上下载妹子图的实现代码
2013/08/13 Python
Python Web开发模板引擎优缺点总结
2014/05/06 Python
整理Python中的赋值运算符
2015/05/13 Python
python解决方案:WindowsError: [Error 2]
2016/08/28 Python
浅析Python中MySQLdb的事务处理功能
2016/09/21 Python
django限制匿名用户访问及重定向的方法实例
2018/02/07 Python
python中关于数据类型的学习笔记
2020/07/19 Python
Python 中如何写注释
2020/08/28 Python
Tarte Cosmetics官网:美国最受欢迎的化妆品公司之一
2017/08/24 全球购物
欧洲领先的电子和电信零售商和服务提供商:Currys PC World Business
2017/12/05 全球购物
Merrell美国官网:美国登山运动鞋品牌
2018/02/07 全球购物
美国婚礼礼品网站:MyWeddingFavors
2018/09/26 全球购物
娇韵诗法国官网:Clarins法国
2019/01/29 全球购物
戴尔马来西亚官网:Dell Malaysia
2020/05/02 全球购物
家长会主持词
2014/03/26 职场文书
护士求职信
2014/07/05 职场文书
二年级学生期末评语
2014/12/26 职场文书
2015年村级财务管理制度
2015/08/04 职场文书
闭幕词的写作格式与范文!
2019/06/24 职场文书
详解MySQL 用户权限管理
2021/04/20 MySQL
CSS 使用 resize 实现图片拖拽切换预览功能(强大功能)
2021/08/23 HTML / CSS