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调用cmd命令行制作刷博器
Jan 13 Python
基于Python实现的扫雷游戏实例代码
Aug 01 Python
python获取文件版本信息、公司名和产品名的方法
Oct 05 Python
Python中文件操作简明介绍
Apr 13 Python
Python实现定时任务
Feb 08 Python
利用python和ffmpeg 批量将其他图片转换为.yuv格式的方法
Jan 08 Python
浅谈Python2之汉字编码为unicode的问题(即类似\xc3\xa4)
Aug 12 Python
在Python中画图(基于Jupyter notebook的魔法函数)
Oct 28 Python
Django框架HttpRequest对象用法实例分析
Nov 01 Python
Python3打包exe代码2种方法实例解析
Feb 17 Python
python数据库操作mysql:pymysql、sqlalchemy常见用法详解
Mar 30 Python
还在手动盖楼抽奖?教你用Python实现自动评论盖楼抽奖(一)
Jun 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
php注入实例
2006/10/09 PHP
生成sessionid和随机密码的例子
2006/10/09 PHP
PHP采集利器 Snoopy 试用心得
2011/07/03 PHP
[原创]ThinkPHP中SHOW_RUN_TIME不能正常显示运行时间的解决方法
2015/10/10 PHP
php轻松实现文件上传功能
2016/03/03 PHP
JavaScript开发时的五个注意事项
2007/12/08 Javascript
jQuery maxlength文本字数限制插件
2010/04/16 Javascript
js修改table中Td的值(定义td的双击事件)
2013/01/10 Javascript
用JavaScript实现动画效果的方法
2013/07/20 Javascript
JQuery 文本框回车跳到下一个文本框示例代码
2013/08/30 Javascript
深入理解javascript中defer的作用
2013/12/11 Javascript
JS实现让网页背景图片斜向移动的方法
2015/02/25 Javascript
JavaScript将一个数组插入到另一个数组的方法
2015/03/19 Javascript
JS中的THIS和WINDOW.EVENT.SRCELEMENT详解
2015/05/25 Javascript
测试IE浏览器对JavaScript的AngularJS的兼容性
2015/06/19 Javascript
jquery实现的蓝色二级导航条效果代码
2015/08/24 Javascript
AngularJS教程之简单应用程序示例
2016/08/16 Javascript
详解JavaScript的内置对象
2016/12/07 Javascript
jQuery实现模拟flash头像裁切上传功能示例
2016/12/11 Javascript
Vue.js:使用Vue-Router 2实现路由功能介绍
2017/02/22 Javascript
vue实现简单表格组件实例详解
2017/04/16 Javascript
在nodejs中创建child process的方法
2021/01/26 NodeJs
利用 Chrome Dev Tools 进行页面性能分析的步骤说明(前端性能优化)
2021/02/24 Javascript
Python多线程、异步+多进程爬虫实现代码
2016/02/17 Python
Python3转换html到pdf的不同解决方案
2019/03/11 Python
python print 格式化输出,动态指定长度的实现
2020/04/12 Python
使用phonegap进行本地存储的实现方法
2017/03/31 HTML / CSS
美国最大的城市服装和运动鞋零售商:Jimmy Jazz
2016/11/19 全球购物
建筑工程造价专业自荐信
2014/07/08 职场文书
明星邀请函
2015/02/02 职场文书
大学生个人简历自荐信
2015/03/06 职场文书
2015年幼儿园中班开学寄语
2015/05/27 职场文书
个人房屋租赁合同(标准范本)
2019/09/16 职场文书
使用Selenium实现微博爬虫(预登录、展开全文、翻页)
2021/04/13 Python
六种css3实现的边框过渡效果
2021/04/22 HTML / CSS
Ajax异步刷新功能及简单案例
2021/11/20 Javascript