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随手笔记之标准类型内建函数
Dec 02 Python
Python基于贪心算法解决背包问题示例
Nov 27 Python
Python列表推导式、字典推导式与集合推导式用法实例分析
Feb 07 Python
Python绘制正余弦函数图像的方法
Aug 28 Python
python进程和线程用法知识点总结
May 28 Python
Django中提示消息messages的设置方式
Nov 15 Python
使用python远程操作linux过程解析
Dec 04 Python
简单了解Python读取大文件代码实例
Dec 18 Python
python爬虫模拟浏览器访问-User-Agent过程解析
Dec 28 Python
Python3创建Django项目的几种方法(3种)
Jun 03 Python
scrapy中如何设置应用cookies的方法(3种)
Sep 22 Python
Python序列化与反序列化相关知识总结
Jun 08 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实现获取及设置用户访问页面语言类
2014/09/24 PHP
为你总结一些php信息函数
2015/10/21 PHP
php实现图片缩略图的方法
2016/03/29 PHP
thinkphp5修改view到根目录实例方法
2019/07/02 PHP
JS异常处理的一个想法(sofish)
2013/03/14 Javascript
JS自调用匿名函数具体实现
2014/02/11 Javascript
原生js和jQuery随意改变div属性style的名称和值
2014/10/22 Javascript
JavaScript整除运算函数ceil和floor的区别分析
2015/04/14 Javascript
jquery ajax 如何向jsp提交表单数据
2015/08/23 Javascript
JS+CSS实现带有碰撞缓冲效果的竖向导航条代码
2015/09/15 Javascript
JS拖拽组件学习使用
2016/01/19 Javascript
谈一谈JS消息机制和事件机制的理解
2016/04/14 Javascript
js实现定时进度条完成后切换图片
2017/01/04 Javascript
基于layui数据表格以及传数据的方式
2018/08/19 Javascript
vue-router的HTML5 History 模式设置
2018/09/08 Javascript
js canvas实现二维码和图片合成的海报
2020/11/19 Javascript
JS基于开关思想实现的数组去重功能【案例】
2019/02/18 Javascript
微信小程序实现搜索框功能及踩过的坑
2020/06/19 Javascript
解决vue中axios设置超时(超过5分钟)没反应的问题
2020/09/04 Javascript
[49:08]OpTic vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
微信 用脚本查看是否被微信好友删除
2016/10/28 Python
Python实现将一个大文件按段落分隔为多个小文件的简单操作方法
2017/04/17 Python
Python实现在线暴力破解邮箱账号密码功能示例【测试可用】
2017/09/06 Python
Windows下PyCharm2018.3.2 安装教程(图文详解)
2019/10/24 Python
酒店服务实习自我鉴定
2013/09/22 职场文书
广告设计专业自荐信范文
2013/11/14 职场文书
新员工试用期自我鉴定
2014/04/17 职场文书
企业安全生产月活动总结
2014/07/05 职场文书
幼儿园中班区域活动总结
2014/07/09 职场文书
一份文言文检讨书
2014/09/13 职场文书
学习党的群众路线教育实践活动心得体会范文
2014/11/03 职场文书
2014年幼儿园园长工作总结
2014/12/17 职场文书
2016年社区创先争优活动总结
2016/04/05 职场文书
2019年员工旷工保证书!
2019/06/28 职场文书
Python NumPy灰度图像的压缩原理讲解
2021/08/04 Python