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中精确输出JSON浮点数的方法
Apr 18 Python
python插入数据到列表的方法
Apr 30 Python
Python读写文件方法总结
Jun 09 Python
Python 使用os.remove删除文件夹时报错的解决方法
Jan 13 Python
Windows安装Python、pip、easy_install的方法
Mar 05 Python
详解Python import方法引入模块的实例
Aug 02 Python
在pycharm中设置显示行数的方法
Jan 16 Python
六行python代码的爱心曲线详解
May 17 Python
33个Python爬虫项目实战(推荐)
Jul 08 Python
Python实现简单的列表冒泡排序和反转列表操作示例
Jul 10 Python
Django数据统计功能count()的使用
Nov 30 Python
MoviePy简介及Python视频剪辑自动化
Dec 18 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
用Socket发送电子邮件
2006/10/09 PHP
PHP 只允许指定IP访问(允许*号通配符过滤IP)
2014/07/08 PHP
PHP使用函数用法详解
2018/09/30 PHP
关于IFRAME 自适应高度的研究
2006/07/20 Javascript
js调用activeX获取u盘序列号的代码
2011/11/21 Javascript
精心挑选的15个jQuery下拉菜单制作教程
2012/06/15 Javascript
利用jQuery实现可以编辑的表格
2014/05/26 Javascript
JavaScript、jQuery与Ajax的关系
2016/01/24 Javascript
AngularJS 入门教程之事件处理器详解
2016/08/19 Javascript
Node.js自定义实现文件路由功能
2017/09/22 Javascript
vue.js动画中的js钩子函数的实现
2018/07/06 Javascript
vue中v-for循环给标签属性赋值的方法
2018/10/18 Javascript
基于vue.js组件实现分页效果
2018/12/29 Javascript
手把手15分钟搭一个企业级脚手架
2019/09/16 Javascript
vue中axios防止多次触发终止多次请求的示例代码(防抖)
2020/02/16 Javascript
[01:03:38]2014 DOTA2国际邀请赛中国区预选赛5.21 CNB VS CIS
2014/05/22 DOTA
纯Python开发的nosql数据库CodernityDB介绍和使用实例
2014/10/23 Python
python制作英语翻译小工具代码实例
2019/09/09 Python
Python API自动化框架总结
2019/11/12 Python
5行Python代码实现图像分割的步骤详解
2020/05/25 Python
浅析pandas随机排列与随机抽样
2021/01/22 Python
HTML5实现经典坦克大战坦克乱走还能发出一个子弹
2013/09/02 HTML / CSS
英国领先的电子、技术和办公用品购物网站:Ebuyer
2018/04/04 全球购物
亿阳信通股份有限公司笔试题(C#)
2016/03/04 面试题
如何用Java判断一个文件或目录是否存在
2012/11/19 面试题
大学生毕业的自我鉴定
2013/11/13 职场文书
学习朴航瑛老师爱岗敬业先进事迹思想汇报
2014/09/17 职场文书
三严三实对照检查材料
2014/09/22 职场文书
2015年挂职锻炼工作总结
2014/12/12 职场文书
2014企业年终工作总结
2014/12/23 职场文书
西安导游词
2015/02/12 职场文书
七年级作文之英语老师
2019/10/28 职场文书
解决thinkphp6(tp6)在状态码500下不报错,或者显示错误“Malformed UTF-8 characters”的问题
2021/04/01 PHP
Java elasticsearch安装以及部署教程
2021/06/28 Java/Android
python 进阶学习之python装饰器小结
2021/09/04 Python
Python利用FlashText算法实现替换字符串
2022/03/31 Python