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通过yield实现数组全排列的方法
Mar 18 Python
Zabbix实现微信报警功能
Oct 09 Python
python3之微信文章爬虫实例讲解
Jul 12 Python
Python实现判断给定列表是否有重复元素的方法
Apr 11 Python
Python二叉树的遍历操作示例【前序遍历,中序遍历,后序遍历,层序遍历】
Dec 24 Python
详解Python解决抓取内容乱码问题(decode和encode解码)
Mar 29 Python
Python合并2个字典成1个新字典的方法(9种)
Dec 19 Python
基于打开pycharm有带图片md文件卡死问题的解决
Apr 24 Python
关于keras.layers.Conv1D的kernel_size参数使用介绍
May 22 Python
如何用Python 实现全连接神经网络(Multi-layer Perceptron)
Oct 15 Python
pytorch中的numel函数用法说明
May 13 Python
python人工智能human learn绘图可创建机器学习模型
Nov 23 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
星际争霸兵种名称对照表
2020/03/04 星际争霸
php读取xml实例代码
2010/01/28 PHP
php多种形式发送邮件(mail qmail邮件系统 phpmailer类)
2014/01/22 PHP
php插入排序法实现数组排序实例
2015/02/16 PHP
php 如何禁用eval() 函数实例详解
2016/12/01 PHP
PHP实现的redis主从数据库状态检测功能示例
2017/07/20 PHP
使用git迁移Laravel项目至新开发环境的步骤详解
2020/04/06 PHP
jsTree 基于JQuery的排序节点 Bug
2011/07/26 Javascript
jquery 清空file域示例(兼容个浏览器)
2013/10/11 Javascript
node.js开发中使用Node Supervisor实现监测文件修改并自动重启应用
2014/11/04 Javascript
Lua表达式和控制结构学习笔记
2014/12/15 Javascript
JavaScript使用FileSystemObject对象写入文本文件内容的方法
2015/08/05 Javascript
JavaScript实现搜索框的自动完成功能(一)
2016/02/25 Javascript
利用js编写响应式侧边栏
2016/09/17 Javascript
ES6概念 Symbol toString()方法
2016/12/25 Javascript
有关JS中的0,null,undefined,[],{},'''''''',false之间的关系
2017/02/14 Javascript
jQuery插件FusionCharts绘制的2D帕累托图效果示例【附demo源码】
2017/03/28 jQuery
JS实现深度优先搜索求解两点间最短路径
2019/01/17 Javascript
使用vue自定义指令开发表单验证插件validate.js
2019/05/23 Javascript
layer关闭弹出窗口触发表单提交问题的处理方法
2019/09/25 Javascript
Layer组件多个iframe弹出层打开与关闭及参数传递的方法
2019/09/25 Javascript
Vue组件通信中非父子组件传值知识点总结
2019/12/05 Javascript
vue 弹出遮罩层样式实例
2020/07/22 Javascript
使用python3.5仿微软记事本notepad
2016/06/15 Python
Python实现将照片变成卡通图片的方法【基于opencv】
2018/01/17 Python
Linux CentOS7下安装python3 的方法
2018/01/21 Python
Python实现的txt文件去重功能示例
2018/07/07 Python
使用Python的Dataframe取两列时间值相差一年的所有行方法
2018/07/10 Python
python tkinter canvas使用实例
2019/11/04 Python
Python模块的定义,模块的导入,__name__用法实例分析
2020/01/07 Python
Python多进程multiprocessing、进程池用法实例分析
2020/03/24 Python
婚庆公司的创业计划书
2014/01/22 职场文书
品质主管岗位职责
2014/03/16 职场文书
派出所副所长四风问题个人整改措施思想汇报
2014/10/13 职场文书
拾金不昧通报表扬范文
2015/05/05 职场文书
解决Navicat for MySQL 连接 MySQL 报2005错误的问题
2021/05/29 MySQL