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. ios添加-webkit-overflow-scrolling依然卡顿

    项目由vue-cli2创建 在overflow: auto区域内滑动ios手机出现卡顿,搜索资料后添加-webkit-overflow-scrolling: touch ios bug: 1.滑动区域 ...

  2. 【leetcode】908. Smallest Range I

    题目如下: 解题思路:简单的不能再简单的题目了,对于任意一个A[i]来说,其可能的最小的最大值是A[i]-K,最大的最小值是A[i]+K.遍历数组,求出所有元素中最大的最小值和最小的最大值,两者之差( ...

  3. 开放融合 | “引擎级”深度对接!POLARDB与SuperMap联合构建首个云原生时空平台

    阿里巴巴新一代自研云数据库POLARDB与超图软件SuperMap GIS实现 “引擎级”深度对接,构建了自治.弹性.高可用的云原生时空数据管理平台联合解决方案,推出了业界首个“云原生数据库+云原生G ...

  4. apue 第10章 信号signal

    每种信号都有名字,都是以SIG开头 信号机制最简单的接口是signal函数 #include <signal.h> typedef void (*sighandler_t)(int); s ...

  5. hdu 4705 Y (树形dp)

    Description Input 4 1 2 1 3 1 4 题目的意思是给你一棵树,让你找到所有不在一条路径上的三个点的情况个数.乍一看正向处理比较麻烦,我们从反方向考虑,如果是取在一条路径上的3 ...

  6. OC学习篇之---@property和@synthesize的使用

    在之前一片文章我们介绍了OC中的内存管理:http://blog.csdn.net/jiangwei0910410003/article/details/41924683,今天我们来介绍两个关键字的使 ...

  7. vue-element-admin安装失败的问题

    根据官网的介绍,从GitHub下载以后,安装依赖的时候一直不成功,试了很多办法,最终解决 先记录错误的过程: 从GitHub下载 在当前文件夹的地址栏输入 “cmd” 打开窗口 输入 npm inst ...

  8. 外部表及oracle数据库内存

    create table alert1 (log varchar2(1000))2 organization external3 (type oracle_loader4 default direct ...

  9. bash: service: command not found 错误的解决方法

    service命令是要用ROOT用户来执行的,而出错的用户是用su root切换到ROOT用户下,这个命令没有也不会把环境带过去! 用如下命令就不会出错了:su - root 注意:su 后面是一个空 ...

  10. spfa(模板)

    #include<iostream> #include<cstdio> #include<cstring> using namespace std; int cnt ...