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. go语言从例子开始之Example5.for循环

    for 是 Go 中唯一的循环结构.这里有 for 循环的三个基本使用方式. package main import "fmt" func main() { 最常用的方式,带单个循 ...

  2. bzoj 1176 cdq分治套树状数组

    题面: 维护一个W*W的矩阵,初始值均为S.每次操作可以增加某格子的权值,或询问某子矩阵的总权值.修改操作数M<=160000,询问数Q<=10000,W<=2000000. Inp ...

  3. ubuntu openssl 生成密钥对

    一般情况下ubuntu和mac系统都会自带openssl,安装之前先测试一下,打开终端,输入openssl,如果出现以下画面,即已安装. root@jiang:/home/kevin/work/ope ...

  4. 12.Unsafe原子性操作

    import sun.misc.Unsafe; /** * JDK8 * JDK 的此jar 包中的 Unsafe 类提供了硬件级别的原子性操作 */ public class UnsafeTest ...

  5. Myeclipse 崩溃闪退 Java was started but returned exit code =-1

    出现如上图所述情况的原因可能是因为虚拟机jdk和myEclipse配置文件中的vm地址发生冲突报出的错误 第一种解决办法:只需要将你jdk文件下的bin目录下的javaw.exe文件的全部路径复制到M ...

  6. 【leetcode】948. Bag of Tokens

    题目如下: You have an initial power P, an initial score of 0 points, and a bag of tokens. Each token can ...

  7. Day One-Python基础

    Python第一节 安装教程就不发了,太心累了!大家可以上百度查,网上都会有 python种类 JavaPython cPython pypy 两种编码  字节码 和 机器码 unicode utf8 ...

  8. POJ A Plug for UNIX (最大流 建图)

    Description You are in charge of setting up the press room for the inaugural meeting of the United N ...

  9. Service系统服务(一):安装一个KVM服务器、KVM平台构建及简单管理、virsh基本管理操作、xml配置文件的应用、为虚拟机制作快照备份、快建新虚拟机

    一.安装一个KVM服务器 目标: 本例要求准备一台 RHEL7.2 服务器,将其搭建为KVM平台,主要完成下列操作: 1> 关闭本机的SELinux保护.防火墙服务   2> 挂载RHEL ...

  10. 简单使用Laravel-admin构建一个功能强大的后台管理

    Laravel-admin可以快速构建一个功能强大的后台,方便快速开发. 以下内容记录简单使用Laravel-admin,以及遇到小错误的解决方法. Laravel-admin 依赖以下环境 需要提前 ...