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实现分析apache和nginx日志文件并输出访客ip列表的方法
Apr 04 Python
fastcgi文件读取漏洞之python扫描脚本
Apr 23 Python
python 实现数组list 添加、修改、删除的方法
Apr 04 Python
python 输出上个月的月末日期实例
Apr 11 Python
详解Python的循环结构知识点
May 20 Python
Python 3.6 -win64环境安装PIL模块的教程
Jun 20 Python
Python 控制终端输出文字的实例
Jul 12 Python
Python any()函数的使用方法
Oct 28 Python
python实现异常信息堆栈输出到日志文件
Dec 26 Python
在python中修改.properties文件的操作
Apr 08 Python
Python txt文件如何转换成字典
Nov 03 Python
selenium携带cookies模拟登陆CSDN的实现
Jan 19 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 检查扩展库或函数是否可用的代码
2010/04/06 PHP
php+mysql数据库实现无限分类的方法
2014/12/12 PHP
php带抄送和密件抄送的邮件发送方法
2015/03/20 PHP
Yii2中设置与获取别名的函数(setAlias和getAlias)用法分析
2016/07/25 PHP
php判断/计算闰年的方法小结【三种方法】
2019/07/06 PHP
使用IE的地址栏来辅助调试Web页脚本
2007/03/08 Javascript
精通JavaScript 纠正 cleanWhitespace函数
2010/03/11 Javascript
ExtJS 入门
2010/10/29 Javascript
关于递归运算的顺序测试代码
2011/11/30 Javascript
JS高级调试技巧:捕获和分析 JavaScript Error详解
2014/03/16 Javascript
JavaScript位置与大小(1)之正确理解和运用与尺寸大小相关的DOM属性
2015/12/26 Javascript
JavaScript_object基础入门(必看篇)
2016/06/13 Javascript
对vue中v-if的常见使用方法详解
2018/09/28 Javascript
jQuery无冲突模式详解
2019/01/17 jQuery
深入学习TypeScript 、React、 Redux和Ant-Design的最佳实践
2019/06/17 Javascript
javascript实现时间日期的格式化的方法汇总
2020/08/06 Javascript
解决Python运行文件出现out of memory框的问题
2018/12/03 Python
python实现自动解数独小程序
2019/01/21 Python
python实现定时压缩指定文件夹发送邮件
2020/12/22 Python
python保存字典和读取字典的实例代码
2019/07/07 Python
python3 selenium自动化测试 强大的CSS定位方法
2019/08/23 Python
wxPython实现带颜色的进度条
2019/11/19 Python
python学生管理系统的实现
2020/04/05 Python
python boto和boto3操作bucket的示例
2020/10/30 Python
世界上最好的威士忌和烈性酒购买网站:The Whisky Exchange
2016/11/20 全球购物
StubHub新加坡:购买和出售全球活动门票
2017/03/10 全球购物
初中三好学生事迹材料
2014/01/13 职场文书
淘宝客服自我总结鉴定
2014/01/25 职场文书
环保专项行动方案
2014/05/12 职场文书
环境日宣传活动总结
2014/07/09 职场文书
甜品店创业计划书
2014/08/14 职场文书
税务干部群众路线教育实践活动对照检查材料
2014/09/20 职场文书
幼儿园辞职信范文
2015/02/27 职场文书
简历自我评价模板
2015/03/11 职场文书
房地产公司财务总监岗位职责
2015/04/03 职场文书
Netty分布式客户端处理接入事件handle源码解析
2022/03/25 Java/Android