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 相关文章推荐
使用wxpython实现的一个简单图片浏览器实例
Jul 10 Python
Python面向对象编程中关于类和方法的学习笔记
Jun 30 Python
Python爬取qq music中的音乐url及批量下载
Mar 23 Python
Python基于百度AI的文字识别的示例
Apr 21 Python
python命令行参数用法实例分析
Jun 25 Python
python set内置函数的具体使用
Jul 02 Python
如何基于Python批量下载音乐
Nov 11 Python
Python FTP文件定时自动下载实现过程解析
Nov 12 Python
python使用 cx_Oracle 模块进行查询操作示例
Nov 28 Python
python学生信息管理系统实现代码
Dec 17 Python
解决TensorFlow模型恢复报错的问题
Feb 06 Python
解决jupyter notebook打不开无反应 浏览器未启动的问题
Apr 10 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
删除无限分类并同时删除它下面的所有子分类的方法
2010/08/08 PHP
php源代码安装常见错误与解决办法分享
2013/05/28 PHP
PHP 以POST方式提交XML、获取XML,解析XML详解及实例
2016/10/26 PHP
Js 时间间隔计算的函数(间隔天数)
2011/11/15 Javascript
JS实现定时页面弹出类似QQ新闻的提示框
2013/11/07 Javascript
浅析document.ready和window.onload的区别讲解
2013/12/18 Javascript
JQuery的Ajax中Post方法传递中文出现乱码的解决方法
2014/10/21 Javascript
理解javascript回调函数
2014/12/28 Javascript
JavaScript继承学习笔记【新手必看】
2016/05/10 Javascript
Bootstrap源码解读标签、徽章、缩略图和警示框(8)
2016/12/26 Javascript
详解vue组件基础
2018/05/04 Javascript
js运算符的一些特殊用法
2018/07/29 Javascript
JS module的导出和导入的实现代码
2019/02/25 Javascript
RxJS的入门指引和初步应用
2019/06/15 Javascript
微信小程序实现拖拽功能
2019/09/26 Javascript
微信小程序indexOf的替换方法(推荐)
2020/01/14 Javascript
解决vue-router 嵌套路由没反应的问题
2020/09/22 Javascript
Python编程之string相关操作实例详解
2017/07/22 Python
Python验证文件是否可读写代码分享
2017/12/11 Python
Python+request+unittest实现接口测试框架集成实例
2018/03/16 Python
python利用selenium进行浏览器爬虫
2019/04/25 Python
python3 tkinter实现点击一个按钮跳出另一个窗口的方法
2019/06/13 Python
python实现证件照换底功能
2019/08/20 Python
Python+Selenium+phantomjs实现网页模拟登录和截图功能(windows环境)
2019/12/11 Python
关于python3.7安装matplotlib始终无法成功的问题的解决
2020/07/28 Python
美国最受欢迎的度假租赁网站:VRBO
2016/08/02 全球购物
size?德国官方网站:英国伦敦的球鞋精品店
2018/03/17 全球购物
马来西亚最大的在线隐形眼镜商店:MrLens
2019/03/27 全球购物
StubHub新西兰:购买和出售你的门票
2019/04/22 全球购物
南京某软件公司的.net面试题
2015/11/30 面试题
出纳岗位职责
2013/11/09 职场文书
单位接收函范文
2015/01/30 职场文书
签约仪式致辞
2015/07/30 职场文书
小学教师教育随笔
2015/08/14 职场文书
2016年清明节寄语
2015/12/04 职场文书
Redis 限流器
2022/05/15 Redis