Day 5-7 exec 和元类的创建.
exec方法
元类
exec(str_command,globals,locals)
参数1:字符串形式的命令
参数2:全局作用域(字典形式). 如果不指定,默认globals
参数3:局部作用(字典形式).如果不指定.默认locals
可以把exec命令的执行当成是一个函数的执行,会将执行期间产生的名字存放于局部名称空间中
g = {} # 定义2个空字典
l = {} exec("""
global x,y
x = 100
y = 20
z=30
""", g, l) print(g) # 输出的是一个全局字典变量,里面肯定包括了x:100,y:20
print(l) # 局部字典变量.{'z': 30}
python中一切皆是对象,类本身也是一个对象,当使用关键字class的时候,python解释器在加载class的时候就会创建一个对象(这里的对象指的是类而非类的实例),因而我们可以将类当作一个对象去使用,同样满足第一类对象的概念,可以:
把类赋值给一个变量
把类作为函数参数进行传递
把类作为函数的返回值
在运行时动态地创建类
一切皆对象,对象可以怎么用?对象的特点:
1、都可以被引用,x=obj
2、都可以当作函数的参数传入
3、都可以当作函数的返回值
4、都可以当作容器类的元素,l=[func,time,obj,1]
什么是元类?
元类是类的类,是类的模板
元类是用来控制如何创建类的,正如类是创建对象的模板一样,而元类的主要目的是为了控制类的创建行为
元类的实例化的结果为我们用class定义的类,正如类的实例为对象(f1对象是Foo类的一个实例,Foo类是 type 类的一个实例)
type是python的一个内建元类,用来直接控制生成类,python中任何class定义的类其实都是type类实例化的对象
# 产生类的类,称之为元类.
#类的创建方法之一: class 创建
class Chinese:
def __init__(self, name, age):
self.name = name
self.age = age def tell_info(self):
print("name:%s, age:%s" % (self.name,self.age)) p1 = Chinese("jack",18) p1.tell_info() #类的创建方法之二:type创建
#类的三要素:
class_name = "Chinese" # 类名
class_base = (object,) # 继承.父类
#类体代码
class_body = """
def __init__(self, name, age):
self.name = name
self.age = age def tell_info(self):
print("name:%s, age:%s" % (self.name,self.age))
"""
class_dict = {}
exec(class_body,globals(), class_dict) # 创建一个类的字典
print(class_dict)
Chinese1 = type(class_name, class_base, class_dict)
p2 = Chinese1("Alex", 39)
p2.tell_info()
手动模拟class创建类的过程):将创建类的步骤拆分开,手动去创建
第一步:
#准备工作: #创建类主要分为三部分 1 类名 2 类的父类 3 类体 #类名
class_name='Chinese'
#类的父类
class_bases=(object,)
#类体
class_body="""
def __init__(self,name,age):
self.name=name
self.age=age
def tell_info(self):
print("name:%s, age:%s" % (self.name,self.age))
"""
第二步:
(先处理类体->名称空间):类体定义的名字都会存放于类的名称空间中(一个局部的名称空间),我们可以事先定义一个空字典,然后用exec去执行类体的代码(exec产生名称空间的过程与真正的class过程类似,只是后者会将__开头的属性变形),生成类的局部名称空间,即填充字典.
class_dic={}
exec(class_body,globals(),class_dic) # 把生成的类的局部名称空间填充到class_dict中.
第三步:
Chinese = type(class_name, class_base, class_dict) #生成一个Chinese的类
p2 = Chinese("jack", 39)
p2.tell_info() # 和class生成的类一样可以调用
type 接收三个参数:
- 第 1 个参数是字符串 ‘Foo’,表示类名
- 第 2 个参数是元组 (object, ),表示所有的父类
- 第 3 个参数是字典,这里是一个空字典,表示没有定义属性和方法
Day 5-7 exec 和元类的创建.的更多相关文章
- eval、exec及元类、单例实现的5种方法
eval内置函数 # eval内置函数的使用场景:# 1.执行字符串会得到相应的执行结果# 2.一般用于类型转化,该函数执行完有返回值,得到dict.list.tuple等dic_str = ...
- exec模块,元类与ORV的应用
exec模块的补充 1.是什么? exec是一个Python内置模块. 2.exec的作用: ''' x = 10 def func1(): pass ''' 可以把"字符串形式" ...
- exec()和元类
目录 一.exec()的作用 二.元类 2.1什么是元类,元类的作用是什么? 2.2自定义创建元类 一.exec()的作用 exec执行储存在字符串或文件中的 Python 语句,相比于 eval,e ...
- CSIC_716_20191213【内置函数exec、元类】
In memory of the more than 300 thousand Chinese murdered exec( 字符类型的代码,全局变量,局部变量 ).其中,全局变量和局部变量可以写成字 ...
- python 面向对象进阶之元类metaclass
一:知识储备 exec exec:三个参数 参数一:字符串形式的命令 参数二:全局作用域(字典形式),如果不指定,默认为globals() 参数三:局部作用域(字典形式),如果不指定,默认为local ...
- Python之路(第二十八篇) 面向对象进阶:类的装饰器、元类
一.类的装饰器 类作为一个对象,也可以被装饰. 例子 def wrap(obj): print("装饰器-----") obj.x = 1 obj.y = 3 obj.z = 5 ...
- (day38)元类+ORM
目录 一.exec模块的补充 二.元类 (一)什么是元类 (二)通过class关键字创建类 (三)自定义元类控制类的创建 三.ORM 一.exec模块的补充 python的内置模块,可以把" ...
- [Python之路] 元类(引申 单例模式)
一.类也是对象 当我们定义一个变量或者函数的时候,我们可以在globals()的返回值字典中找到响应的映射: def A(): print("This is function A" ...
- python 元类
转载自 http://blog.jobbole.com/21351/ 类也是对象 在理解元类之前,你需要先掌握Python中的类.Python中类的概念借鉴于Smalltalk,这显得有些奇特.在大 ...
随机推荐
- 【FJWC 2019】 森林
[FJWC 2019] 森林 样例输入 0 5 1 0 0 2 样例输出 1 2 3 3 我们发现,答案就是直径加上直径上某个点出发,不经过其他直径上的点的最长链.这里的直径可以是任意一条直径. 首先 ...
- java 图片转换成base64字符串
import java.io.ByteArrayOutputStream; import java.io.FileInputStream;import java.io.FileOutputStream ...
- (二 -4) 天猫精灵接入Home Assistant-自动发现Mqtt设备--传感器系列
https://www.home-assistant.io/blog/2015/10/11/measure-temperature-with-esp8266-and-report-to-mqtt/ 最 ...
- 从code review到Git commit log
最近在读一本技术类的书:朱赟——<跃迁:从技术到管理的硅谷路径>,其中聊了很多很有趣的观点,比如:技术管理.技术实践.硅谷文化.个人成长等. 读到关于硅谷人如何做code review这一 ...
- Scala--模式匹配和样例类
模式匹配应用场景:switch语句,类型查询,析构,样例类 一.更好的switch val ch :Char = '+' val sign = ch match{ case '+' => 1 c ...
- redis底层设计(五)——内部运作机制
5.1 数据库 5.1.1 数据库的结构: Redis 中的每个数据库,都由一个redis.h/redisDb 结构表示: typedef struct redisDb { // 保存着数据库以整数表 ...
- elf格式转换为hex格式文件的两种方法
这周工作终于不太忙了,可以写点笔记总结一下了. 之前的文章如何在Keil-MDK开发环境生成Bin格式文件,介绍了如何在Keil开发环境使用fromelf软件,将生成的axf文件转换为bin文件,这次 ...
- 实现可调整宽高的DIV(左右拖动和上下拖动)
前言 本例是在React中实现,不过改一改通过原生js也很好实现,另外兼容性也做到了IE9.(IE8讲道理也是可以的). 首先看一下需要实现的需求: 要拖动图中的白色横条调整绿色和蓝色区域的高度,要拖 ...
- vue better-scroll用法
滚动位置固定:在vue中通过路由切换页面时组件会自动滚动到顶部,需要监听滚动行为才能让滚动位置固定,better-scroll解决了这个问题. 常用效果:移动端很常见的效果,当滑动右边部分的时候,左边 ...
- nodejs图片处理工具gm用法
在做H5应用中,有时候会涉及到一些图片加工处理的操作,nodejs有一个很好的后台图片处理module,就是这里说的gm.gm有官方文档,但感觉写得太抽象,反而看不懂了.这里把一些常见的用法写下,供大 ...