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找出文件中使用率最高的汉字实例详解
Jun 03 Python
python杀死一个线程的方法
Sep 06 Python
Python中shutil模块的学习笔记教程
Apr 04 Python
Python实现高斯函数的三维显示方法
Dec 29 Python
Python一个简单的通信程序(客户端 服务器)
Mar 06 Python
Python3.5 Pandas模块缺失值处理和层次索引实例详解
Apr 23 Python
关于Python 的简单栅格图像边界提取方法
Jul 05 Python
python删除文件夹下相同文件和无法打开的图片
Jul 16 Python
python构建指数平滑预测模型示例
Nov 21 Python
python实现双色球随机选号
Jan 01 Python
pandas中read_csv、rolling、expanding用法详解
Apr 21 Python
django inspectdb 操作已有数据库数据的使用步骤
Feb 07 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
暴雪前总裁遗憾:没尽早追赶Dota 取消星际争霸幽灵
2020/03/08 星际争霸
PHP通过插入mysql数据来实现多机互锁实例
2014/11/05 PHP
PHP 生成N个不重复的随机数
2015/01/21 PHP
PHP对XML内容进行修改和删除实例代码
2016/10/26 PHP
php实现微信公众号创建自定义菜单功能的实例代码
2019/06/11 PHP
Laravel使用原生sql语句并调用的方法
2019/10/09 PHP
PHP中类与对象功能、用法实例解读
2020/03/27 PHP
JS 各种网页尺寸判断实例方法
2013/04/18 Javascript
JQuery实现倒计时按钮具体方法
2013/11/14 Javascript
ExtJS4中使用mixins实现多继承示例
2013/12/03 Javascript
轻松创建nodejs服务器(8):非阻塞是如何实现的
2014/12/18 NodeJs
使用js画图之画切线
2015/01/12 Javascript
nodejs 整合kindEditor实现图片上传
2015/02/03 NodeJs
jQuery Validate初步体验(二)
2015/12/12 Javascript
JavaScript电子时钟倒计时
2016/01/09 Javascript
使用javascript插入样式
2016/03/14 Javascript
解决vue keep-alive 数据更新的问题
2018/09/21 Javascript
小程序实现列表删除功能
2018/10/30 Javascript
微信小程序对图片进行canvas压缩的方法示例详解
2020/11/12 Javascript
linux下安装easy_install的方法
2013/02/10 Python
基于wxPython的GUI实现输入对话框(2)
2019/02/27 Python
python实现对图片进行旋转,放缩,裁剪的功能
2019/08/07 Python
Python人工智能之路 jieba gensim 最好别分家之最简单的相似度实现
2019/08/13 Python
详解PyTorch手写数字识别(MNIST数据集)
2019/08/16 Python
PyCharm MySQL可视化Database配置过程图解
2020/06/09 Python
HTML5 video 视频标签使用介绍
2014/02/03 HTML / CSS
意大利在线购买隐形眼镜网站:VisionDirect.it
2019/03/18 全球购物
世界汽车零件:World Car Parts
2019/09/04 全球购物
银行青年文明号事迹材料
2014/05/31 职场文书
法学专业求职信
2014/07/15 职场文书
优秀党员先进材料
2014/12/18 职场文书
护士长2015年终工作总结
2015/04/24 职场文书
2015年医院药剂科工作总结
2015/05/04 职场文书
学困生转化工作总结
2015/08/13 职场文书
Django+Celery实现定时任务的示例
2021/06/23 Python
一小时学会TensorFlow2之基本操作2实例代码
2021/09/04 Python