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中防止sql注入的方法详解
Feb 25 Python
Ubuntu18.04中Python2.7与Python3.6环境切换
Jun 14 Python
PyCharm2018 安装及破解方法实现步骤
Sep 09 Python
你还在@微信官方?聊聊Python生成你想要的微信头像
Sep 25 Python
Python3列表List入门知识附实例
Feb 09 Python
python模式 工厂模式原理及实例详解
Feb 11 Python
python虚拟环境模块venv使用及示例
Mar 04 Python
Python序列化pickle模块使用详解
Mar 05 Python
pyecharts动态轨迹图的实现示例
Apr 17 Python
Python读取yaml文件的详细教程
Jul 21 Python
python 实现一个图形界面的汇率计算器
Nov 09 Python
python爬虫泛滥的解决方法详解
Nov 25 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
phpmyadmin 常用选项设置详解版
2010/03/07 PHP
php列出mysql表所有行和列的方法
2015/03/13 PHP
什么是PEAR?什么是PECL?PHP中两个容易混淆的概念解释
2015/07/01 PHP
yii分页组件用法实例分析
2015/12/28 PHP
php判断手机浏览还是web浏览,并执行相应的动作简单实例
2016/07/28 PHP
PHP实现的登录,注册及密码修改功能分析
2016/11/25 PHP
php设计模式之观察者模式定义与用法经典示例
2019/09/19 PHP
laravel 实现上传图片到本地和前台访问示例
2019/10/21 PHP
JavaScript中的new的使用方法与注意事项
2007/05/16 Javascript
json简单介绍
2008/06/10 Javascript
数组Array进行原型prototype扩展后带来的for in遍历问题
2010/02/07 Javascript
JavaScript小技巧 2.5 则
2010/09/12 Javascript
jQuery示例收集
2010/11/05 Javascript
JavaScript 用cloneNode方法克隆节点的代码
2012/10/15 Javascript
用Js实现的动态增加表格示例自己写的
2013/10/21 Javascript
jquery sortable的拖动方法示例详解
2014/01/16 Javascript
禁止页面刷新让F5快捷键及右键都无效
2014/01/22 Javascript
理解javascript闭包
2015/12/15 Javascript
js实现弹窗暗层效果
2017/01/16 Javascript
漂亮实用的页面loading(加载)封装代码
2017/02/03 Javascript
JavaScript中创建对象的7种模式详解
2017/02/21 Javascript
详解webpack打包vue时提取css
2017/05/26 Javascript
浅谈关于axios和session的一些事
2017/07/13 Javascript
iconfont的三种使用方式详解
2018/08/05 Javascript
详解js静态检查工具eslint配置文件
2018/11/23 Javascript
详解vue挂载到dom上会发生什么
2019/01/20 Javascript
基于Python的PIL库学习详解
2019/05/10 Python
详解Pandas之容易让人混淆的行选择和列选择
2019/07/10 Python
Python实现钉钉订阅消息功能
2020/01/14 Python
python实现简易版学生成绩管理系统
2020/06/22 Python
ETO男装官方网店:ETO Jeans
2019/02/28 全球购物
计算机专业应届生求职信
2014/04/06 职场文书
家长会欢迎标语
2014/06/24 职场文书
学校查摆问题整改措施
2014/09/28 职场文书
实习科室评语
2015/01/04 职场文书
mysql sum(if())和count(if())的用法说明
2022/01/18 MySQL