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操作xml文件详细介绍
Jun 09 Python
Python使用shelve模块实现简单数据存储的方法
May 20 Python
基于wxpython开发的简单gui计算器实例
May 30 Python
python设计模式大全
Jun 27 Python
Python标准库之collections包的使用教程
Apr 27 Python
Python解析json之ValueError: Expecting property name enclosed in double quotes: line 1 column 2(char 1)
Jul 06 Python
python的常用模块之collections模块详解
Dec 06 Python
python爬虫刷访问量 2019 7月
Aug 01 Python
浅析使用Python搭建http服务器
Oct 27 Python
Python 实现取多维数组第n维的前几位
Nov 26 Python
python paramiko远程服务器终端操作过程解析
Dec 14 Python
JAVA SpringMVC实现自定义拦截器
Mar 16 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学习笔记之 函数声明(二)
2011/06/09 PHP
Laravel框架学习笔记(二)项目实战之模型(Models)
2014/10/15 PHP
Laravel框架中Blade模板的用法示例
2017/08/30 PHP
PHP递归遍历文件夹去除注释并压缩php源代码的方法示例
2018/05/23 PHP
一个收集图片的bookmarlet(js 刷新页面中的图片)
2010/05/27 Javascript
javascript实时显示北京时间的方法
2015/03/12 Javascript
Node.js的MongoDB驱动Mongoose基本使用教程
2016/03/01 Javascript
基于javascript实现页面加载loading效果
2020/09/15 Javascript
jquery选择器中的空格与大于号>、加号+与波浪号~的区别介绍
2016/06/24 Javascript
JavaScript 冒泡排序和选择排序的实现代码
2016/09/03 Javascript
Javascript操作dom对象之select全面解析
2017/04/24 Javascript
D3.js进阶系列之CSV表格文件的读取详解
2017/06/06 Javascript
原生JS实现日历组件的示例代码
2017/09/22 Javascript
微信小程序获取用户openid的实现
2018/12/24 Javascript
微信小程序如何实现精确的日期时间选择器
2020/01/21 Javascript
python处理cookie详解
2014/02/07 Python
python字符串的方法与操作大全
2018/01/30 Python
对python中list的拷贝与numpy的array的拷贝详解
2019/01/29 Python
python给微信好友定时推送消息的示例
2019/02/20 Python
快速解决pyqt5窗体关闭后子线程不同时退出的问题
2019/06/19 Python
PyQt5基本控件使用之消息弹出、用户输入、文件对话框的使用方法
2019/08/06 Python
基于python实现自动化办公学习笔记(CSV、word、Excel、PPT)
2019/08/06 Python
Python使用turtle库绘制小猪佩奇(实例代码)
2020/01/16 Python
css3实现背景模糊的三种方式(小结)
2020/05/15 HTML / CSS
css3实现平移效果(transfrom:translate)的示例
2020/11/13 HTML / CSS
英国领先的独立酒精饮料零售商:DrinkSupermarket
2021/01/13 全球购物
汽车专业人才自我鉴定范文
2013/12/29 职场文书
《陈涉世家》教学反思
2014/04/12 职场文书
标准版离职证明书
2014/09/12 职场文书
诉讼授权委托书范本
2014/10/05 职场文书
党的群众路线教育实践活动个人对照检查材料(企业)
2014/11/05 职场文书
2014年综合治理工作总结
2014/11/20 职场文书
人事局接收函
2015/01/30 职场文书
幼儿园辞职书
2015/02/26 职场文书
教你部署vue项目到docker
2022/04/05 Vue.js
css弧边选项卡的项目实践
2023/05/07 HTML / CSS