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 正则式 概述及常用字符
May 07 Python
Python发送Email方法实例
Aug 21 Python
TensorFlow模型保存/载入的两种方法
Mar 08 Python
Python实现读取Properties配置文件的方法
Mar 29 Python
打包python 加icon 去掉cmd黑窗口方法
Jun 24 Python
Python之time模块的时间戳,时间字符串格式化与转换方法(13位时间戳)
Aug 12 Python
python基于pdfminer库提取pdf文字代码实例
Aug 15 Python
python分布式编程实现过程解析
Nov 08 Python
Python利用 utf-8-sig 编码格式解决写入 csv 文件乱码问题
Feb 21 Python
Pycharm最常用的快捷键及使用技巧
Mar 05 Python
Python爬取YY评级分数并保存数据实现过程解析
Jun 01 Python
安装Anaconda3及使用Jupyter的方法
Oct 27 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
星际争霸 Starcraft 编年史
2020/03/14 星际争霸
PHP生成excel时单元格内换行问题的解决方法
2010/08/26 PHP
PHP隐形一句话后门,和ThinkPHP框架加密码程序(base64_decode)
2011/11/02 PHP
PHP flock 文件锁详细介绍
2012/12/29 PHP
PHP查询快递信息的方法
2015/03/07 PHP
php使用MySQL保存session会话的方法
2015/06/18 PHP
PHP大文件切割上传功能实例分析
2019/07/01 PHP
JavaScript中的16进制字符(改进)
2011/11/21 Javascript
jQuery ajax dataType值为text json探索分享
2013/09/23 Javascript
jQuery客户端分页实例代码
2013/11/18 Javascript
JavaScript调用传递变量参数的相关问题及解决办法
2015/11/01 Javascript
BootStrap无限级分类(无限极分类封装版)
2016/08/26 Javascript
JavaScript 中 avalon绑定属性总结
2016/10/19 Javascript
js实现的简练高效拖拽功能示例
2016/12/21 Javascript
AngularJS中的拦截器实例详解
2017/04/07 Javascript
在AngularJs中设置请求头信息(headers)的方法及不同方法的比较
2018/09/04 Javascript
基于VUE实现的九宫格抽奖功能
2018/09/30 Javascript
小程序两种滚动公告栏的实现方法
2019/09/17 Javascript
Vue实现计算器计算效果
2020/08/17 Javascript
JavaScript实现拖动对话框效果的实现代码
2020/10/12 Javascript
python中列表元素连接方法join用法实例
2015/04/07 Python
使用pyecharts在jupyter notebook上绘图
2020/04/23 Python
Django 2.0版本的新特性抢先看!
2018/01/05 Python
对pandas将dataframe中某列按照条件赋值的实例讲解
2018/11/29 Python
对python修改xml文件的节点值方法详解
2018/12/24 Python
python调用c++传递数组的实例
2019/02/13 Python
python绘制漏斗图步骤详解
2019/03/04 Python
关于pytorch处理类别不平衡的问题
2019/12/31 Python
selenium+headless chrome爬虫的实现示例
2021/01/08 Python
美国领先的户外服装与装备用品店:Moosejaw
2016/08/25 全球购物
工程预算与管理应届生求职信
2013/10/06 职场文书
大学生个人简历中的自我评价
2013/12/27 职场文书
安全标准化汇报材料
2014/02/03 职场文书
安全月宣传标语
2014/10/07 职场文书
意向协议书
2015/01/27 职场文书
邀请函样本
2015/02/02 职场文书