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通过90行代码搭建一个音乐搜索工具
Jul 29 Python
Python中在for循环中嵌套使用if和else语句的技巧
Jun 20 Python
使用Kivy将python程序打包为apk文件
Jul 29 Python
python学习笔记之列表(list)与元组(tuple)详解
Nov 23 Python
PyQt5实现无边框窗口的标题拖动和窗口缩放
Apr 19 Python
Python实现的逻辑回归算法示例【附测试csv文件下载】
Dec 28 Python
如何爬取通过ajax加载数据的网站
Aug 15 Python
Python自动化导出zabbix数据并发邮件脚本
Aug 16 Python
python英语单词测试小程序代码实例
Sep 09 Python
python 初始化一个定长的数组实例
Dec 02 Python
matplotlib之pyplot模块之标题(title()和suptitle())
Feb 22 Python
解决numpy数组互换两行及赋值的问题
Apr 17 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中sprintf与printf函数用法区别解析
2014/02/17 PHP
php使用function_exists判断函数可用的方法
2014/11/19 PHP
ThinkPHP自定义函数解决模板标签加减运算的方法
2015/07/03 PHP
给WordPress的编辑后台添加提示框的代码实例分享
2015/12/25 PHP
PHP面向对象继承用法详解(优化与减少代码重复)
2016/12/02 PHP
php实现登录页面的简单实例
2019/09/29 PHP
一步一步制作jquery插件Tabs实现过程
2010/07/06 Javascript
css3元素简单的闪烁效果实现(html5 jquery)
2013/12/28 Javascript
离开当前页面前使用js判断条件提示是否要离开页面
2014/05/02 Javascript
JavaScript跨浏览器获取页面中相同class节点的方法
2015/03/03 Javascript
基于jQuery实现的美观星级评论打分组件代码
2015/10/30 Javascript
基于jquery实现表格无刷新分页
2016/01/07 Javascript
js和jquery实现监听键盘事件示例代码
2020/06/24 Javascript
无阻塞加载js,防止因js加载不了影响页面显示的问题
2016/12/18 Javascript
jQuery Validate表单验证插件的基本使用方法及功能拓展
2017/01/04 Javascript
jQuery实现动态删除LI的方法
2017/05/30 jQuery
setTimeout时间设置为0详细解析
2018/03/13 Javascript
Vue实现搜索 和新闻列表功能简单范例
2018/03/16 Javascript
zbar解码二维码和条形码示例
2014/02/07 Python
python基础教程之序列详解
2014/08/29 Python
用python做一个搜索引擎(Pylucene)的实例代码
2017/07/05 Python
详解Python中 sys.argv[]的用法简明解释
2017/12/20 Python
Python清空文件并替换内容的实例
2018/10/22 Python
Python实现哲学家就餐问题实例代码
2020/11/09 Python
浅谈cookie和localStorage那些事
2019/08/27 HTML / CSS
印度低票价航空公司:GoAir
2017/10/11 全球购物
迪卡侬(Decathlon)加拿大官网:源自法国的运动专业超市
2020/11/22 全球购物
数百万免费的图形资源:Freepik
2020/09/21 全球购物
《小蝌蚪找妈妈》教学反思
2014/02/21 职场文书
七夕相亲活动策划方案
2014/08/31 职场文书
六年级小学生评语
2014/12/26 职场文书
结婚保证书(卖身契)
2015/02/26 职场文书
2015年信息中心工作总结
2015/05/25 职场文书
活动宣传稿范文
2015/07/23 职场文书
关于vue中如何监听数组变化
2021/04/28 Vue.js
golang语言指针操作
2022/04/14 Golang