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程序语言快速上手教程
Jul 18 Python
python修改操作系统时间的方法
May 18 Python
python函数中return后的语句一定不会执行吗?
Jul 06 Python
Python实现将照片变成卡通图片的方法【基于opencv】
Jan 17 Python
快速解决安装python没有scripts文件夹的问题
Apr 03 Python
Python中的Django基本命令实例详解
Jul 15 Python
Python常见MongoDB数据库操作实例总结
Jul 24 Python
使用tensorflow实现线性svm
Sep 07 Python
在python中获取div的文本内容并和想定结果进行对比详解
Jan 02 Python
快速解决pyqt5窗体关闭后子线程不同时退出的问题
Jun 19 Python
Python3标准库glob文件名模式匹配的问题
Mar 13 Python
浅析pandas随机排列与随机抽样
Jan 22 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之数组(遍历顺序)  Laruence原创
2012/06/13 PHP
php查询ip所在地的方法
2014/12/05 PHP
使用 PHPStorm 开发 Laravel
2015/03/24 PHP
浅谈mysql_query()函数的返回值问题
2016/09/05 PHP
Yii框架创建cronjob定时任务的方法分析
2017/05/23 PHP
PHP文件上传小程序 适合初学者学习!
2019/05/23 PHP
PHP中类与对象功能、用法实例解读
2020/03/27 PHP
学习YUI.Ext 第四天--对话框Dialog的使用
2007/03/10 Javascript
Dom 是什么的详细说明
2010/10/25 Javascript
JS记录用户登录次数实现代码
2014/01/15 Javascript
nodejs中的fiber(纤程)库详解
2015/03/24 NodeJs
javascript密码强度校验代码(两种方法)
2015/08/10 Javascript
自定义刻度jQuery进度条及插件
2015/09/02 Javascript
JavaScript必知必会(九)function 说起 闭包问题
2016/06/08 Javascript
jQuery布局组件EasyUI Layout使用方法详解
2017/02/28 Javascript
Angular 2父子组件之间共享服务通信的实现
2017/07/04 Javascript
利用Angular2 + Ionic3开发IOS应用实例教程
2018/01/15 Javascript
浅谈Webpack打包优化技巧
2018/06/12 Javascript
bootstrap里bootstrap动态加载下拉框的实例讲解
2018/08/10 Javascript
js 实现在2d平面上画8的方法
2018/10/10 Javascript
深入理解令牌认证机制(token)
2019/08/22 Javascript
[01:37]TI4西雅图DOTA2前线报道 VG拿下首胜教练357给出获胜秘诀
2014/07/10 DOTA
[00:58]2016年国际邀请赛勇士令状宣传片
2016/06/01 DOTA
Python正则表达式匹配ip地址实例
2014/10/09 Python
Python决策树和随机森林算法实例详解
2018/01/30 Python
python模仿网页版微信发送消息功能
2018/02/24 Python
解决pandas中读取中文名称的csv文件报错的问题
2018/07/04 Python
FragranceNet中文网:北美健康美容线上零售商
2020/08/26 全球购物
财会自我鉴定范文
2013/12/27 职场文书
音乐教学反思
2014/02/02 职场文书
态度决定一切演讲稿
2014/05/20 职场文书
颐和园英文导游词
2015/01/30 职场文书
公司财务经理岗位职责
2015/04/08 职场文书
2015年幼儿园保育员工作总结
2015/04/23 职场文书
现货白银电话营销话术
2015/05/29 职场文书
jQuery class属性操作addClass()与removeClass()、hasClass()、toggleClass()
2021/03/31 jQuery