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): ...
随机推荐
- JS匿名包装器(自执行匿名函数)
一.获得循环序号 for(var i = 0; i < 10; i++) { (function(e) { setTimeout(function() { console.log(e); }, ...
- 入门GoldenGate总结
前言 GoldenGate 是oracle官方的一款数据同步产品,类似于msyql的主从复制,配置也稍稍复杂,其中概念一定要搞清楚,不然会被坑的爬不起. 坑 1.数据在线同步(不是指数据初始化),只能 ...
- python 读取文件时,精确的保留数据
import numpy as npimport pandas as pd point = pd.read_csv('waypoint21.csv') with pd.option_context(' ...
- php结合Redis实现100万用户投票项目,并实时查看到投票情况的案例
场景:某网站需要对其项目做一个投票系统,投票项目上线后一小时之内预计有100万用户进行投票,希望用户投票完就能看到实时的投票情况 这个场景可以使用redis+mysql冷热数据交换来解决. 何为冷热数 ...
- Mac上无法使用蓝牙时的7个修复程序
蓝牙是一个很普遍的技术,除非它出现问题,你才会发现它.例如,你听歌很顺利时,直到AirPods突然断连.大多数时候,这是一个相对容易的修复,但有时可能会有些棘手. https://www.macdow ...
- 【leetcode】994. Rotting Oranges
题目如下: In a given grid, each cell can have one of three values: the value 0 representing an empty cel ...
- hdu 3572 Task Schedule (Dinic模板)
Problem Description Our geometry princess XMM has stoped her study in computational geometry to conc ...
- JMeter 阶梯式加压测试插件 Concurrency Thread Group
jmeter阶梯式加压测试:JMeter 阶梯式加压测试插件 Stepping Thread Group 由于Stepping Thread Group插件相对来说过于老旧,已不被官方所推荐. 所以这 ...
- 说下vue工程中代理配置proxy
这个代理配置不需要后台进行ngnix代理跳转了,前端可以做.在vue.config.js文件中进行配置,如下: module.exports = { publicPath: process.env.V ...
- 使用ui给定的字体,通过css引入字体库
@font-face { font-family: 'LCDMonoNormal'; src: url('../../assets/fonts/LCDM2N__.eot'); src: url('.. ...