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): ...
随机推荐
- 在 Visual Studio 中使用 Q# 进行量子编程
1 量子计算机与量子编程 1.1 量子计算机 Quantum computing is computing using quantum-mechanical phenomena, such as su ...
- C++中表示字符串长度
string的size(), length() 和 char[]的strlen()都是不包括‘\0'的,他们都是“外貌协会”的,只停留在表面.而sizeof则是从内存角度来反映,它是包括’\0‘的.注 ...
- PHP数组函数实现栈与队列的方法介绍(代码示例)
根据php提供的四个关于数组的函数: array_push(),array_pop(),array_unshift(),array_shift() 配合数组本身,一下子就实现了栈(stack)和队例( ...
- MySQL慢SQL语句常见诱因
原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11429037.html 1. 无索引.索引失效导致慢查询 如果在一张几千万数据的表中以一个没有索引的列 ...
- docker 运行jenkins及vue项目与springboot项目(二.docker运行jenkins为自动打包运行做准备)
docker 运行jenkins及vue项目与springboot项目: 一.安装docker 二.docker运行jenkins为自动打包运行做准备 三.jenkins的使用及自动打包vue项目 四 ...
- java基础学习笔记四(异常)
Java中的异常 Exception 如图可以看出所有的异常跟错误都继承与Throwable类,也就是说所有的异常都是一个对象. 从大体来分异常为两块: 1.error---错误 : 是指程序无法处理 ...
- 【leetcode】907. Sum of Subarray Minimums
题目如下: 解题思路:我的想法对于数组中任意一个元素,找出其左右两边最近的小于自己的元素.例如[1,3,2,4,5,1],元素2左边比自己小的元素是1,那么大于自己的区间就是[3],右边的区间就是[4 ...
- NOIWC2019 懵逼记
弱省蒟蒻,第一次也是最后一次来冬令营.. Day [-inf,-1] \(woc\)咋啥都听不懂,没错在下划水王. Day 0 白天上课继续划水..晚上跑去试机,骗了半天交互的分就滚了..半夜里竟然睡 ...
- 通过create-react-app从零搭建react环境
一. 快速开始: 全局安装脚手架: $ npm install -g create-react-app 通过脚手架搭建项目: $ create-react-app <项目名称> 开始项目: ...
- cooike和session到底是个啥
1.为什么需要cookie ? cookie不属于http协议范围,由于http协议无法保持状态,即无状态属性.但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞生. co ...