In memory of the more than 300 thousand Chinese murdered

exec( 字符类型的代码,全局变量,局部变量 )。其中,全局变量和局部变量可以写成字典形式进行赋值。

举例:

'''
字符串
exec(字符串,全局变量、局部变量)
''' x = 10 expr = """
z = 30
sum = x + y + z
print(sum)
""" def func():
y = 20
exec(expr)
exec(expr, {'x': 1, 'y': 2})
exec(expr, {'x': 1, 'y': 2}, {'y': 3, 'z': 4}) func()

  

exec关于局部名称空间和全局名称空间的关系,请参照以下例子:     exec(  字符串格式是语句,全局名称空间,局部名称空间)

# _*_ coding: gbk _*_
# @Author: Wonder x = 10 expr = """ z = 30
y = 5
global x
x = 18 m =10 print('x',x)
print('z',z) sum = x + y + z
print(sum)
"""
func1 = {'x': 1, 'y': 2}
func2 = {'x': 3, 'y': 4}
func3 = {'x': 99, 'y': 99} def func():
y = 20
x = 11 exec(expr)
exec(expr, func1, func2)
exec(expr, func3, func1)
print(func1, '\n\n\n\n')
print(func2, '\n\n\n\n')
print(func3) func()

  

元类

元类是类的类,普通类是元类type的实例化对象,元类:type以及继承了type的类称为元类

元类实例化------>类,类实例化------>对象。

# _*_ coding: gbk _*_
# @Author: Wonder # 正常调用类
class Teach:
def __init__(self, name, age):
self.name = name
self.age = age @property
def bark(self):
print('%s 别叫' % self.name) obj = Teach('dog', 18)
print(obj)
print(obj.name)
obj.bark # 通过元类,生成类。type的三要素(class_name,class_bases, class_dict)
class_dict = {}
exec('''
def __init__(self, name, age):
self.name = name
self.age = age @property
def bark(self):
print('%s 别叫' % self.name)
''', globals(), class_dict) Teach2 = type('Teach', (object,), class_dict)
obj1 = Teach2('horse', 17)
print(obj1)
print(obj1.name)
obj1.bark

 执行的结果如下:---->证明(两种方式都可以生成类)

定制元类,进行控制类的创建行为

# _*_ coding: gbk _*_
# @Author: Wonder
class Mymeta(type):
def __init__(self, class_name, class_bases, class_dict):
'''
此处可以对类名,类局部名称空间中的一些参数进行条件控制
:param class_name:
:param class_bases:
:param class_dict:
'''
print('假装通过我,创造了类Teach') super().__init__(class_name, class_bases, class_dict) # 正常调用类
class Teach(object, metaclass=Mymeta): # Mymeta(class_name,class_bases,class_dict)
def __init__(self, name, age):
self.name = name
self.age = age @property
def bark(self):
print('%s 别叫' % self.name) obj = Teach('dog', 18)
obj.bark  

需要注意的是,一定要写super().__init__(class_name, class_bases, class_dict)  ,重用type生成类的功能

执行结果如下图,

定制元类,进行控制类的实例化行为

# _*_ coding: gbk _*_
# @Author: Wonder
class Mymeta(type):
def __init__(self, class_name, class_bases, class_dict):
print('假装通过我,创造了类Teach')
super().__init__(class_name, class_bases, class_dict) def __call__(self, *args, **kwargs): # 调用类,都会先触发__call__, 实例化的三部曲
# 1、造一个空对象
obj = object.__new__(self)
# 2、初始化对象
self.__init__(obj, *args, **kwargs)
# 3、返回一个对象
print('假装通过我来实例化对象')
return obj # 正常调用类
class Teach(object, metaclass=Mymeta): # Mymeta(class_name,class_bases,class_dict)
def __init__(self, name, age):
self.name = name
self.age = age @property
def bark(self):
print('%s 别叫' % self.name) obj = Teach('dog', 18)
obj.bark

  调用类,会触发__call__;用object.__new__ 造一个空对象 ;初始化对象时,空对象作为第一个参数传入__init__。

以上代码执行结果如下:

CSIC_716_20191213【内置函数exec、元类】的更多相关文章

  1. day31 反射,内置方法,元类

    目录 一.反射 1 什么是反射 2 如何实现反射 二.内置方法 1 什么是内置方法 2 为什么要用内置方法 3 如何使用内置方法 3.1 str 3.2 del 三.元类 1 什么是元类 2 clas ...

  2. 4月17日 python学习总结 反射、object内置方法、元类

    一.反射 下述四个函数是专门用来操作类与对象属性的,如何操作? 通过字符串来操作类与对象的属性,这种操作称为反射 class People: country="China" def ...

  3. Python学习笔记011——内置函数exec()

    1 描述 把一个字符串当成语句执行 exec()  执行储存在字符串或文件中的 Python 语句,相比于  eval() , exec() 可以执行更复杂的 Python 代码. exec函数和ev ...

  4. 有关于python内置函数exec和eval一些见解笔记

    eval是将函数内的字符串以计算式的方式进行计算并给与外部一个值. 例: a=eval('1+1') print(a) >>>>2 但是如果出现在函数内部字符串中进行赋值会抛出 ...

  5. Python 函数与内置函数

    1.函数的基本定义 def 函数名称(参数) 执行语句 return 返回值 def : 定义函数的关键字: 函数名称:顾名思义,就是函数的名字,可以用来调用函数,不能使用关键字来命名,做好是用这个函 ...

  6. day28-面相对象的特殊成员、内置函数

    1. isinstance与issubclass 1.1.isinstance(obj,cls) 检查obj是否是类cls的对象,或者是类cls的子类的对象 class A: pass class B ...

  7. 学习过程中遇到的python内置函数,后续遇到会继续补充进去

    1.python内置函数isinstance(数字,数字类型),判断一个数字的数字类型(int,float,comple).是,返回True,否,返回False2.python内置函数id()可以查看 ...

  8. python — lambda表达式与内置函数

    目录 1 lambda表达式 (匿名函数) 2 内置函数 1 lambda表达式 (匿名函数) 用于表示简单的函数 lambda表达式,为了解决简单函数的情况: def func(a1,a2): == ...

  9. python 常见内置函数setattr、getattr、delattr、setitem、getitem、delitem

    常见内置函数 内置函数:在类的内部,特定时机自动触发的函数 示例1:setattr.getattr.delattr class Person: # def __init__(self, name): ...

随机推荐

  1. jvm加载包名和类名相同的类的规则,以及如何加载包名和类名相同的类(转)

    jvm包括三种类加载器: 第一种:bootstrap classloader:加载java的核心类. 第二种:extension classloader:负责加载jre的扩展目录中的jar包. 第三种 ...

  2. input file 上传文件类型控制

    文件类型 accept *.3gpp audio/3gpp, video/3gpp.ac3 audio/ac3.asf allpication/vnd.ms-asf.au audio/basic.cs ...

  3. word--->pdf资料转载..

    https://blog.csdn.net/dsn727455218/article/details/80667927

  4. 51单片机外部中断INT0实例(汇编程序)

    ;普中51开发板 ;单片机的P3.2(INT0)引脚与按键K3脚连接 ;用汇编语言实现:按一次K1外部中断INT0响应一次,LED显示值加1(十进制), ;前提是共阴数码LED第一位,需要设定,由P0 ...

  5. 解决PageHelper.startPage(page, size)后,关于PageInfo的total等属性不正确等问题

    在解决PageHelper.startPage(page, size);的位置问题后,又遇到total等信息错误,主要还是不细心,两个不同的List实例化进PageInfo,不能混在一起,同时要确保这 ...

  6. docker 运行jenkins及vue项目与springboot项目(二.docker运行jenkins为自动打包运行做准备)

    docker 运行jenkins及vue项目与springboot项目: 一.安装docker 二.docker运行jenkins为自动打包运行做准备 三.jenkins的使用及自动打包vue项目 四 ...

  7. 【leetcode】925.Long Pressed Name

    题目如下: Your friend is typing his name into a keyboard.  Sometimes, when typing a character c, the key ...

  8. 【TCP】四次握手原因 / TIME_WAIT作用

    为什么建立TCP连接需要三次握手? 原因:为了应对网络中存在的延迟的重复数组的问题 例子: 假设client发起连接的连接请求报文段在网络中没有丢失,而是在某个网络节点长时间滞留了,导致延迟到达ser ...

  9. 使用node-static运行vue打包文件dist

    vue打包后的文件dist,如果想上线之前查看效果,方法如下: npm install -g node-static 进入到dist文件夹,运行static命令 打开上面地址

  10. 集训队8月1日(拓扑排序+DFS+主席树入门)

    上午看书总结 今天上午我看了拓扑排序,DFS+剪枝,相当于回顾了一下,写了三个比较好的例题.算法竞赛指南93~109页. 1.状态压缩+拓扑排序 https://www.cnblogs.com/246 ...