CSIC_716_20191213【内置函数exec、元类】
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、元类】的更多相关文章
- day31 反射,内置方法,元类
目录 一.反射 1 什么是反射 2 如何实现反射 二.内置方法 1 什么是内置方法 2 为什么要用内置方法 3 如何使用内置方法 3.1 str 3.2 del 三.元类 1 什么是元类 2 clas ...
- 4月17日 python学习总结 反射、object内置方法、元类
一.反射 下述四个函数是专门用来操作类与对象属性的,如何操作? 通过字符串来操作类与对象的属性,这种操作称为反射 class People: country="China" def ...
- Python学习笔记011——内置函数exec()
1 描述 把一个字符串当成语句执行 exec() 执行储存在字符串或文件中的 Python 语句,相比于 eval() , exec() 可以执行更复杂的 Python 代码. exec函数和ev ...
- 有关于python内置函数exec和eval一些见解笔记
eval是将函数内的字符串以计算式的方式进行计算并给与外部一个值. 例: a=eval('1+1') print(a) >>>>2 但是如果出现在函数内部字符串中进行赋值会抛出 ...
- Python 函数与内置函数
1.函数的基本定义 def 函数名称(参数) 执行语句 return 返回值 def : 定义函数的关键字: 函数名称:顾名思义,就是函数的名字,可以用来调用函数,不能使用关键字来命名,做好是用这个函 ...
- day28-面相对象的特殊成员、内置函数
1. isinstance与issubclass 1.1.isinstance(obj,cls) 检查obj是否是类cls的对象,或者是类cls的子类的对象 class A: pass class B ...
- 学习过程中遇到的python内置函数,后续遇到会继续补充进去
1.python内置函数isinstance(数字,数字类型),判断一个数字的数字类型(int,float,comple).是,返回True,否,返回False2.python内置函数id()可以查看 ...
- python — lambda表达式与内置函数
目录 1 lambda表达式 (匿名函数) 2 内置函数 1 lambda表达式 (匿名函数) 用于表示简单的函数 lambda表达式,为了解决简单函数的情况: def func(a1,a2): == ...
- python 常见内置函数setattr、getattr、delattr、setitem、getitem、delitem
常见内置函数 内置函数:在类的内部,特定时机自动触发的函数 示例1:setattr.getattr.delattr class Person: # def __init__(self, name): ...
随机推荐
- day12 python函数名的应用 闭包 迭代器
day12 python 一.函数名的应用(是第一类对象) 函数名的命名规范和变量是一样的 函数名其实就是变量名 def func(): print('i am funct ...
- 48th Numpy 常见数组
1.全0数组 np.zeros(shape, dtype=float, order='C') 指定长度的一维数组 >>> np.zeros(5) array([ 0., 0., ...
- pip飞起来了
这里说下Windows下的修改方法,看了网上很多的教程发现都不行,尝试了好久终于发现了可行的方法. 找到python安装目录下的:\Lib\site-packages\pip\models\index ...
- 查看tomcat的版本号
本经验主要介绍在windows下,如何查看tomcat的版本号. 工具/原料 安装了tomcat server的操作系统. 一.绿色版tomcat版本查看--命令catalina version 或者 ...
- MariaDB 选择查询
在本章中,我们将学习如何从表中选择数据. SELECT语句检索所选行. 它们可以包括UNION语句,排序子句,LIMIT子句,WHERE子句,GROUP BY ... HAVING子句和子查询. 查看 ...
- 常见算法和数据结构存在的坑(updating)
数组: c++数组下标都+5会稳. 50005000的别开60006000. 二分: 实数二分可能因为神马精度问题出现了不满足二分序的情况,要小心. 注意二分完后,不能直接用当前数组里存的值,要pd( ...
- 【NOIP2019模拟11.01】Game(贪心+线段树)
Description: 小 A 和小 B 在玩一个游戏,他们两个人每人有
- 关于scrub的详细分析和建议
https://ceph.com/planet/%E5%85%B3%E4%BA%8Escrub%E7%9A%84%E8%AF%A6%E7%BB%86%E5%88%86%E6%9E%90%E5%92%8 ...
- python 标准模块和第三方模块
>>> help('modules') Please wait a moment while I gather a list of all available modules... ...
- Java Freemarker生成word
Java Freemarker生成word freeMaker 简介: FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页.电子邮件.配置文件.源代 ...