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编写简单网络爬虫抓取视频下载资源
Nov 04 Python
Python检测QQ在线状态的方法
May 09 Python
Python中type的构造函数参数含义说明
Jun 21 Python
Python GUI Tkinter简单实现个性签名设计
Jun 19 Python
浅谈Python中函数的定义及其调用方法
Jul 19 Python
pytorch 共享参数的示例
Aug 17 Python
通过 Django Pagination 实现简单分页功能
Nov 11 Python
Python动态声明变量赋值代码实例
Dec 30 Python
python 按钮点击关闭窗口的实现
Mar 04 Python
pycharm中导入模块错误时提示Try to run this command from the system terminal
Mar 26 Python
Python实现多线程下载脚本的示例代码
Apr 03 Python
Python中的变量与常量
Nov 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
Phpbean路由转发的php代码
2008/01/10 PHP
ThinkPHP3.1新特性之对Ajax的支持更加完善
2014/06/19 PHP
人脸识别测颜值、测脸龄、测相似度微信接口
2016/04/07 PHP
ThinkPHP框架实现定时执行任务的两种方法分析
2018/09/04 PHP
php微信分享到朋友圈、QQ、朋友、微博
2019/02/18 PHP
Javascript调试工具(下载)
2007/01/09 Javascript
将jQuery应用于login页面的问题及解决
2009/10/17 Javascript
javascript 获取页面的高度及滚动条的位置的代码
2010/05/06 Javascript
Javascript 键盘事件的组合使用实现代码
2012/05/04 Javascript
javascript object array方法使用详解
2012/12/03 Javascript
JQuery实现简单时尚快捷的气泡提示插件
2012/12/20 Javascript
jquery 简单应用示例总结
2013/08/09 Javascript
Jquery+Ajax+PHP+MySQL实现分类列表管理(上)
2015/10/28 Javascript
省市选择的简单实现(基于zepto.js)
2016/06/21 Javascript
Angular directive递归实现目录树结构代码实例
2017/05/05 Javascript
vue 2.8.2版本配置刚进入时候的默认页面方法
2018/09/21 Javascript
webpack结合express实现自动刷新的方法
2019/05/07 Javascript
vue tab滚动到一定高度,固定在顶部,点击tab切换不同的内容操作
2020/07/22 Javascript
Python实现读取目录所有文件的文件名并保存到txt文件代码
2014/11/22 Python
Python3.6安装及引入Requests库的实现方法
2018/01/24 Python
python调用opencv实现猫脸检测功能
2019/01/15 Python
Python批量生成幻影坦克图片实例代码
2019/06/04 Python
浅谈Pytorch中的自动求导函数backward()所需参数的含义
2020/02/29 Python
安装不同版本的tensorflow与models方法实现
2021/02/20 Python
HTML5 Canvas标签使用收录
2009/07/07 HTML / CSS
网易微博Web App用HTML5开发的过程介绍
2012/06/13 HTML / CSS
前端实现打印图像功能
2019/08/27 HTML / CSS
Origins悦木之源香港官网:雅诗兰黛集团高端植物护肤品牌
2018/03/21 全球购物
美国高品质个性化珠宝销售网站:Jewlr
2018/05/03 全球购物
网络教育自我鉴定
2013/11/01 职场文书
受欢迎的大学生自我评价
2013/12/05 职场文书
创建文明学校实施方案
2014/03/11 职场文书
停电调休通知
2015/04/16 职场文书
幼儿园综治宣传月活动总结
2015/05/07 职场文书
安全生产学习心得体会
2016/01/18 职场文书
话题作文之诚信
2019/11/28 职场文书