python实现动态创建类的方法分析


Posted in Python onJune 25, 2019

本文实例讲述了python实现动态创建类的方法。分享给大家供大家参考,具体如下:

python作为动态语言,如何在运行时动态创建类呢(python Creating classes dynamically),这在编程时,有时候很有用处,动态生成类,给予相应的属性和方法。通常来说有如下两种方式:

  • 1. 根据条件,硬编码实现。
  • 2. 利用 type metaclass  来实现。

根据条件硬编码

def choose_class(name):
 if name == 'foo':
  class Foo(object):
   pass
  return Foo # 返回一个类,而不是实例
 else:
  class Bar(object):
   pass
  return Bar
MyClass = choose_class('foo') 
print MyClass # 返回一个类,而不是实例
print MyClass() # 创建一个实例

运行后,结果为:

<class '__main__.Foo'>
<__main__.Foo object at 0x00BA8370>

但其实这并不是那么动态,你还得在程序中写完整个class的定义。既然class是对象,也必定可以由什么东西创建出来。在python中,当你用 class 关键字的时候,python将自动创建这个object, 有什么方法能手动创建呢,那就是 type 方法. 这是一个很特殊的方法,能够创建一个类. type 的语法如下:

type(name of the class, 
  tuple of the parent class (for inheritance, can be empty), 
  dictionary containing attributes names and values)

按照这个语法规则,做如下例子:

def echo_msg(self):
 print self.msg
print '===dynamic create class==='+ '*'*50
MyClass = type('MyClass',(object,),{"a":123,"b":"summer","msg":"test message","echo_msg":echo_msg})
print MyClass.a
myclass = MyClass()
myclass.echo_msg()
print myclass.a,myclass.b
print '===dynamic create subclass==='+ '*'*50
MySubClass = type('MySubClass',(MyClass,),{"c":"c-value"})
print MySubClass.c,MySubClass.a,MySubClass.b
print issubclass(MySubClass, MyClass)
mysubclass = MySubClass()
mysubclass.echo_msg()

运行结果如下:

===dynamic create class===**************************************************
123
test message
123 summer
===dynamic create subclass===**************************************************
c-value 123 summer
True
test message

这个例子利用  type 创建了一个MyClass 类,然后又创建了 MySubClass 继承了MyClass 类,并绑定了属性,方法。MySubClass 也绑定自己特有的属性,同时又继承了基类的属性,方法。

这样就实现了,在python 中动态创建类,主要功臣就是 type 方法,为什么type 有这么厉害,其最终原因是:type 是 metaclass ,元类,用来创建类的类。打个比方:

Class=MetaClass()
instance=Class()

什么是 metaclass ,又将怎么利用呢,后面的文章将详细讲解 python metaclass.

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
举例介绍Python中的25个隐藏特性
Mar 30 Python
全面了解Python的getattr(),setattr(),delattr(),hasattr()
Jun 14 Python
神经网络相关之基础概念的讲解
Dec 29 Python
nohup后台启动Python脚本,log不刷新的解决方法
Jan 14 Python
django模板结构优化的方法
Feb 28 Python
Python提取转移文件夹内所有.jpg文件并查看每一帧的方法
Jun 27 Python
基于Python安装pyecharts所遇的问题及解决方法
Aug 12 Python
用python爬取历史天气数据的方法示例
Dec 30 Python
python GUI库图形界面开发之PyQt5复选框控件QCheckBox详细使用方法与实例
Feb 28 Python
Python Django搭建网站流程图解
Jun 13 Python
Python .py生成.pyd文件并打包.exe 的注意事项说明
Mar 04 Python
Python用tkinter实现自定义记事本的方法详解
Mar 31 Python
python pandas写入excel文件的方法示例
Jun 25 #Python
python多线程http压力测试脚本
Jun 25 #Python
Pyqt5 基本界面组件之inputDialog的使用
Jun 25 #Python
对PyQt5的输入对话框使用(QInputDialog)详解
Jun 25 #Python
如何使用Python标准库进行性能测试
Jun 25 #Python
python绘制评估优化算法性能的测试函数
Jun 25 #Python
Python基于机器学习方法实现的电影推荐系统实例详解
Jun 25 #Python
You might like
高亮度显示php源代码
2006/10/09 PHP
PHP 二维数组根据某个字段排序的具体实现
2014/06/03 PHP
表单提交验证类
2006/07/14 Javascript
js data日期初始化的5种方法
2013/12/29 Javascript
JS和函数式语言的三特性
2014/03/05 Javascript
jQuery中map()方法用法实例
2015/01/06 Javascript
js图片轮播手动切换效果
2015/11/10 Javascript
jQuery实现带分组数据的Table表头排序实例分析
2015/11/24 Javascript
javascript合并表格单元格实例代码
2016/01/03 Javascript
JavaScript的函数式编程基础指南
2016/03/19 Javascript
JS实现字符串转驼峰格式的方法
2016/12/16 Javascript
详解微信小程序开发—你期待的分享功能来了,微信小程序序新增5大功能
2016/12/23 Javascript
超全面的JavaScript开发规范(推荐)
2017/01/21 Javascript
vue双向绑定简要分析
2017/03/23 Javascript
微信小程序实现签到功能
2018/10/31 Javascript
常见的在Python中实现单例模式的三种方法
2015/04/08 Python
Python3搜索及替换文件中文本的方法
2015/05/22 Python
python opencv 图像尺寸变换方法
2018/04/02 Python
如何用用Python将地址标记在地图上
2021/02/07 Python
全球最大的中文旅行网站:去哪儿网
2017/11/16 全球购物
Daisy London官网:英国最大的首饰集团IBB旗下
2019/02/28 全球购物
Sandro法国官网:法国成衣品牌
2019/08/28 全球购物
Myprotein比利时官方网站:欧洲第一运动营养品牌
2020/10/04 全球购物
中软Java笔试题
2012/11/11 面试题
SQL Server数据库笔试题和答案
2016/02/04 面试题
工商管理实习生自我鉴定范文
2013/12/18 职场文书
新闻专业学生的自我评价
2014/02/13 职场文书
二手房购房意向书范本
2014/04/01 职场文书
《大自然的语言》教学反思
2014/04/08 职场文书
图书馆志愿者活动总结
2014/06/27 职场文书
党的群众路线教育实践活动查摆剖析材料
2014/10/10 职场文书
三年级学生评语大全
2014/12/26 职场文书
python xlwt模块的使用解析
2021/04/13 Python
css3实现背景图片半透明内容不透明的方法示例
2021/04/13 HTML / CSS
详解java如何集成swagger组件
2021/06/21 Java/Android
Nginx的gzip相关介绍
2022/05/11 Servers