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查找函数f(x)=0根的解决方法
May 07 Python
python使用opencv读取图片的实例
Aug 17 Python
Python cookbook(数据结构与算法)将序列分解为单独变量的方法
Feb 13 Python
Pandas 数据处理,数据清洗详解
Jul 10 Python
对tf.reduce_sum tensorflow维度上的操作详解
Jul 26 Python
python读取Excel实例详解
Aug 17 Python
使用Python获取并处理IP的类型及格式方法
Nov 01 Python
Python可视化mhd格式和raw格式的医学图像并保存的方法
Jan 24 Python
Django框架orM与自定义SQL语句混合事务控制操作
Jun 27 Python
Python实现GIF图倒放
Jul 16 Python
Python3+RIDE+RobotFramework自动化测试框架搭建过程详解
Sep 23 Python
python树莓派通过队列实现进程交互的程序分析
Jul 04 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获取后台Job管理的实现代码
2011/06/10 PHP
Laravel 创建指定表 migrate的例子
2019/10/09 PHP
Laravel 类和接口注入相关的代码
2019/10/15 PHP
PHP实现随机发放扑克牌
2020/04/21 PHP
Javascript操纵Cookie实现购物车程序
2006/11/23 Javascript
JavaScript 学习笔记(六)
2009/12/31 Javascript
javascript 用记忆函数快速计算递归函数
2010/03/15 Javascript
Jquery AutoComplete自动完成 的使用方法实例
2010/03/19 Javascript
基于jquery的多彩百分比 动态进度条 投票效果显示效果实现代码
2011/08/28 Javascript
仿新浪微博返回顶部的jquery实现代码
2012/10/01 Javascript
定义JavaScript二维数组采用定义数组的数组来实现
2012/12/09 Javascript
js中把JSON字符串转换成JSON对象最好的方法
2014/03/21 Javascript
jQuery scrollFix滚动定位插件
2015/04/01 Javascript
javascript去除空格方法小结
2015/05/21 Javascript
实现音乐播放器的代码(html5+css3+jquery)
2015/08/04 Javascript
js实现图片放大和拖拽特效代码分享
2015/09/05 Javascript
用window.onerror捕获并上报Js错误的方法
2016/01/27 Javascript
JavaScript 经典实例日常收集整理(常用经典)
2016/03/30 Javascript
JS实现一个简单的日历
2017/02/22 Javascript
详解几十行代码实现一个vue的状态管理
2019/01/28 Javascript
Vue 实现登录界面验证码功能
2020/01/03 Javascript
JavaScript 链表定义与使用方法示例
2020/04/28 Javascript
vue cli 3.0通用打包配置代码,不分一二级目录
2020/09/02 Javascript
Vue 实例中使用$refs的注意事项
2021/01/29 Vue.js
Vue实现todo应用的示例
2021/02/20 Vue.js
python re正则匹配网页中图片url地址的方法
2018/12/20 Python
python+selenium实现QQ邮箱自动发送功能
2019/01/23 Python
python3的UnicodeDecodeError解决方法
2019/12/20 Python
python使用隐式循环快速求和的实现示例
2020/09/11 Python
HTML+CSS3模拟心的跳动实例代码
2017/09/05 HTML / CSS
HTML5未来发展趋势
2016/02/01 HTML / CSS
mysql_pconnect()和mysql_connect()有什么区别
2012/05/25 面试题
霸王洗发水广告词
2014/03/14 职场文书
2014年驻村干部工作总结
2014/11/17 职场文书
新学期开学标语2015
2015/07/16 职场文书
sql中mod()函数取余数的用法
2021/05/29 SQL Server