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 相关文章推荐
pygame学习笔记(1):矩形、圆型画图实例
Apr 15 Python
在Python web中实现验证码图片代码分享
Nov 09 Python
详解如何用TensorFlow训练和识别/分类自定义图片
Aug 05 Python
python 3.74 运行import numpy as np 报错lib\site-packages\numpy\__init__.py
Oct 06 Python
PyCharm第一次安装及使用教程
Jan 08 Python
利用Python自动化操作AutoCAD的实现
Apr 01 Python
python3.8.1+selenium实现登录滑块验证功能
May 22 Python
matplotlib常见函数之plt.rcParams、matshow的使用(坐标轴设置)
Jan 05 Python
Python Selenium操作Cookie的实例方法
Feb 28 Python
python 中 .py文件 转 .pyd文件的操作
Mar 04 Python
用Python爬取某乎手机APP数据
Jun 15 Python
python index() 与 rindex() 方法的使用示例详解
Dec 24 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/08/08 PHP
通过PHP的内置函数,通过DES算法对数据加密和解密
2012/06/21 PHP
php获取文件大小的方法
2014/02/26 PHP
浅析iis7.5安装配置php环境
2015/05/10 PHP
PHP 实现公历日期与农历日期的互转换
2017/09/13 PHP
PHP获取二叉树镜像的方法
2018/01/17 PHP
javascript 变量作用域 代码分析
2009/06/26 Javascript
JS 遮照层实现代码
2010/03/31 Javascript
Jquery AJAX 用于计算点击率(统计)
2010/06/30 Javascript
js动态移动滚动条至底部示例代码
2014/04/24 Javascript
微信小程序 Page()函数详解
2016/10/17 Javascript
JavaScript实现图片懒加载(Lazyload)
2016/11/28 Javascript
js实现简单的计算器功能
2017/01/16 Javascript
Angular.js基础学习之初始化
2017/03/10 Javascript
随机生成10个不重复的0-100的数字(实例讲解)
2017/08/16 Javascript
vue项目首屏打开速度慢的解决方法
2019/03/31 Javascript
vue下载二进制流图片操作
2020/10/26 Javascript
[09:40]DAC2018 4.5 SOLO赛 MidOne vs Miracle
2018/04/06 DOTA
python定时器使用示例分享
2014/02/16 Python
Python读写unicode文件的方法
2015/07/10 Python
Python for Informatics 第11章之正则表达式(二)
2016/04/21 Python
Python2随机数列生成器简单实例
2017/09/04 Python
Python3中内置类型bytes和str用法及byte和string之间各种编码转换 问题
2018/09/27 Python
Python使用Pandas读写Excel实例解析
2019/11/19 Python
Python pytesseract验证码识别库用法解析
2020/06/29 Python
python实现录音功能(可随时停止录音)
2020/10/26 Python
Python numpy大矩阵运算内存不足如何解决
2020/11/19 Python
使用 CSS3 中@media 实现网页自适应的示例代码
2020/03/24 HTML / CSS
html5写一个BUI折叠菜单插件的实现方法
2019/09/11 HTML / CSS
学生安全责任书模板
2014/07/25 职场文书
行政秘书工作自我鉴定
2014/09/15 职场文书
党员对照检查材料
2014/09/22 职场文书
教师培训学习心得体会
2016/01/21 职场文书
2019年度开业庆典祝福语大全!
2019/07/05 职场文书
详解Redis基本命令与使用场景
2021/06/01 Redis
pd.DataFrame中的几种索引变换的实现
2022/06/16 Python