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内置函数bin() oct()等实现进制转换
Dec 30 Python
python 基础教程之Map使用方法
Jan 17 Python
Python基于最小二乘法实现曲线拟合示例
Jun 14 Python
python自定义时钟类、定时任务类
Feb 22 Python
如何基于Python制作有道翻译小工具
Dec 16 Python
PyCharm第一次安装及使用教程
Jan 08 Python
DataFrame 数据合并实现(merge,join,concat)
Jun 14 Python
Python enumerate() 函数如何实现索引功能
Jun 29 Python
keras用auc做metrics以及早停实例
Jul 02 Python
从Pytorch模型pth文件中读取参数成numpy矩阵的操作
Mar 04 Python
如何用python反转图片,视频
Apr 24 Python
七个Python必备的GUI库
Apr 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
PHP调用VC编写的COM组件实例
2014/03/29 PHP
Zend Framework框架Smarty扩展实现方法
2016/03/22 PHP
Laravel路由设定和子路由设定实例分析
2016/03/30 PHP
JavaScript 异步调用框架 (Part 1 - 问题 &amp; 场景)
2009/08/03 Javascript
jQuery Ajax使用 全解析
2010/12/15 Javascript
JQuery 在线引用及测试引用是否成功
2014/06/24 Javascript
JavaScript中常用的六种互动方法示例
2015/03/13 Javascript
关于两个jQuery(js)特效冲突的bug的解决办法
2016/09/04 Javascript
最细致的vue.js基础语法 值得收藏!
2016/11/03 Javascript
基于Bootstrap的网页设计实例
2017/03/01 Javascript
vue通过点击事件读取音频文件的方法
2018/05/30 Javascript
Windows下Node爬虫神器Puppeteer安装记
2019/01/09 Javascript
p5.js实现简单货车运动动画
2019/10/23 Javascript
python读写ini配置文件方法实例分析
2015/06/30 Python
python登录豆瓣并发帖的方法
2015/07/08 Python
pandas多级分组实现排序的方法
2018/04/20 Python
Python中文编码知识点
2019/02/18 Python
Django 路由控制的实现
2019/07/17 Python
Python 元组操作总结
2019/09/18 Python
2020新版本pycharm+anaconda+opencv+pyqt环境配置学习笔记,亲测可用
2020/03/24 Python
解决 jupyter notebook 回车换两行问题
2020/04/15 Python
python和C++共享内存传输图像的示例
2020/10/27 Python
Numpy数组的广播机制的实现
2020/11/03 Python
摩顿布朗英国官方网上商店:奢华沐浴、身体和头发护理
2016/10/29 全球购物
Camille Jewelry官网:现代女性时尚首饰
2019/07/07 全球购物
波兰快递服务:Globkurier.pl
2019/11/08 全球购物
完美实现CSS垂直居中的11种方法
2021/03/27 HTML / CSS
本科毕业生专业自荐书范文
2014/02/05 职场文书
导游个人求职信
2014/04/25 职场文书
技术入股合作协议书
2014/10/07 职场文书
医生个人自我剖析材料
2014/10/08 职场文书
检讨书1000字
2014/10/11 职场文书
主持人开场白台词
2015/05/29 职场文书
高中英语教学反思范文
2016/03/02 职场文书
Oracle 11g数据库使用expdp每周进行数据备份并上传到备份服务器
2022/06/28 Oracle
云服务器部署 Web 项目的实现步骤
2022/06/28 Servers