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天气预报采集器实现代码(网页爬虫)
Oct 07 Python
使用python编写android截屏脚本双击运行即可
Jul 21 Python
python实现给微信公众号发送消息的方法
Jun 30 Python
Django model反向关联名称的方法
Dec 15 Python
python实现大学人员管理系统
Oct 25 Python
用python画一只可爱的皮卡丘实例
Nov 21 Python
Python线程障碍对象Barrier原理详解
Dec 02 Python
根据tensor的名字获取变量的值方式
Jan 04 Python
python GUI库图形界面开发之PyQt5线程类QThread详细使用方法
Feb 26 Python
基于Keras中Conv1D和Conv2D的区别说明
Jun 19 Python
使用pytorch实现论文中的unet网络
Jun 24 Python
python人工智能human learn绘图可创建机器学习模型
Nov 23 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的FTP学习(三)
2006/10/09 PHP
深入php var_dump()函数的详解
2013/06/05 PHP
php+ajax实时输入自动搜索匹配的方法
2014/12/26 PHP
Django 中 cookie的使用
2017/08/17 PHP
PHP实现上传图片到数据库并显示输出的方法
2018/05/31 PHP
HR vs CL BO3 第一场 2.13
2021/03/10 DOTA
Tab页界面,用jQuery及Ajax技术实现
2009/09/21 Javascript
javascript学习笔记(九) js对象 设计模式
2012/06/19 Javascript
JavaScript字符串String和Array操作的有趣方法
2012/12/18 Javascript
js 输出内容到新窗口具体实现代码
2013/05/31 Javascript
jQuery 删除/替换DOM元素的几种方式
2014/05/20 Javascript
一个简单的动态加载js和css的jquery代码
2014/09/01 Javascript
Radio 单选JS动态添加的选项onchange事件无效的解决方法
2016/12/12 Javascript
JS实现上传图片实时预览功能
2017/05/22 Javascript
解决vue.js 数据渲染成功仍报错的问题
2018/08/25 Javascript
vuex actions传递多参数的处理方法
2018/09/18 Javascript
js/jquery遍历对象和数组的方法分析【forEach,map与each方法】
2019/02/27 jQuery
js删除对象中的某一个字段的方法实现
2021/01/11 Javascript
Python中使用Flask、MongoDB搭建简易图片服务器
2015/02/04 Python
使用PyV8在Python爬虫中执行js代码
2017/02/16 Python
Tensorflow设置显存自适应,显存比例的操作
2020/02/03 Python
详解python 破解网站反爬虫的两种简单方法
2020/02/09 Python
python——全排列数的生成方式
2020/02/26 Python
Python过滤序列元素的方法
2020/07/31 Python
Python私有属性私有方法应用实例解析
2020/09/15 Python
纯css3实现照片墙效果
2014/12/26 HTML / CSS
用HTML5制作一个简单的桌球游戏的教程
2015/05/12 HTML / CSS
美国全球旅游运营商:Pacific Holidays
2018/06/18 全球购物
党员学习中共十八大报告思想汇报
2014/09/15 职场文书
婚庆司仪开场白
2015/05/29 职场文书
《落花生》教学反思
2016/02/16 职场文书
2019大学竞选班长发言稿
2019/06/27 职场文书
《和时间赛跑》读后感3篇
2019/12/16 职场文书
微信小程序结合ThinkPHP5授权登陆后获取手机号
2021/11/23 PHP
Golang ort 中的sortInts 方法
2022/04/24 Golang
微软发布Windows 11今年最大更新22H2(附 ISO 镜像官方下载)
2022/09/23 数码科技