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写的Socks5协议代理服务器
Aug 06 Python
详细解析Python中的变量的数据类型
May 13 Python
Python socket编程实例详解
May 27 Python
自动化Nginx服务器的反向代理的配置方法
Jun 28 Python
python批量修改文件编码格式的方法
May 31 Python
解决Python plt.savefig 保存图片时一片空白的问题
Jan 10 Python
Python爬虫——爬取豆瓣电影Top250代码实例
Apr 17 Python
numpy和pandas中数组的合并、拉直和重塑实例
Jun 28 Python
pytorch:model.train和model.eval用法及区别详解
Feb 20 Python
Python基于os.environ从windows获取环境变量
Jun 09 Python
如何基于Python和Flask编写Prometheus监控
Nov 25 Python
一篇文章带你搞懂Python类的相关知识
May 20 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程序中的常见漏洞进行攻击
2006/10/09 PHP
PHP数据类型之布尔型的介绍
2013/04/28 PHP
用javascript实现分割提取页面所需内容
2007/05/09 Javascript
有关于eclipse配置spket需要注意的一些地方
2013/04/07 Javascript
jQuery实现固定在网页顶部的菜单效果代码
2015/09/02 Javascript
实现非常简单的js双向数据绑定
2015/11/06 Javascript
jquery遍历函数siblings()用法实例
2015/12/24 Javascript
深入解析桶排序算法及Node.js上JavaScript的代码实现
2016/07/06 Javascript
jquery延迟对象解析
2016/10/26 Javascript
JS刷新父窗口的几种方式小结(推荐)
2016/11/09 Javascript
angularjs实现首页轮播图效果
2017/04/14 Javascript
使用requirejs模块化开发多页面一个入口js的使用方式
2017/06/14 Javascript
AngularJS ng-repeat指令及Ajax的应用实例分析
2017/07/06 Javascript
JQuery元素快速查找与操作
2018/04/22 jQuery
JavaScript变量提升和严格模式实例分析
2019/01/27 Javascript
arctext.js实现文字平滑弯曲弧形效果的插件
2019/05/13 Javascript
JS实现利用闭包判断Dom元素和滚动条的方向示例
2019/08/26 Javascript
layui 根据后台数据动态创建下拉框并同时默认选中的实例
2019/09/02 Javascript
python 快速排序代码
2009/11/23 Python
python制作爬虫爬取京东商品评论教程
2016/12/16 Python
Python编程之黑板上排列组合,你舍得解开吗
2017/10/30 Python
python3.6使用pickle序列化class的方法
2018/10/22 Python
Python 学习教程之networkx
2019/04/15 Python
详解用python写网络爬虫-爬取新浪微博评论
2019/05/10 Python
使用Python自动生成HTML的方法示例
2019/08/06 Python
python 实现简单的FTP程序
2019/12/27 Python
浅谈Keras参数 input_shape、input_dim和input_length用法
2020/06/29 Python
用Python实现职工信息管理系统
2020/12/30 Python
CSS3 实现图形下落动画效果
2020/11/13 HTML / CSS
html5指南-3.如何实现html元素拖拽功能
2013/01/07 HTML / CSS
Original Penguin英国官方网站:美国著名休闲时装品牌
2016/10/30 全球购物
商场总经理岗位职责
2014/02/03 职场文书
市场营销工作计划书
2014/09/15 职场文书
关于幸福的感言
2015/08/03 职场文书
Python办公自动化PPT批量转换操作
2021/09/15 Python
Pandas数据结构之Series的使用
2022/03/31 Python