In memory of the more than 300 thousand Chinese murdered

exec( 字符类型的代码,全局变量,局部变量 )。其中,全局变量和局部变量可以写成字典形式进行赋值。

举例:

  1. '''
  2. 字符串
  3. exec(字符串,全局变量、局部变量)
  4. '''
  5.  
  6. x = 10
  7.  
  8. expr = """
  9. z = 30
  10. sum = x + y + z
  11. print(sum)
  12. """
  13.  
  14. def func():
  15. y = 20
  16. exec(expr)
  17. exec(expr, {'x': 1, 'y': 2})
  18. exec(expr, {'x': 1, 'y': 2}, {'y': 3, 'z': 4})
  19.  
  20. func()

  

exec关于局部名称空间和全局名称空间的关系,请参照以下例子:     exec(  字符串格式是语句,全局名称空间,局部名称空间)

  1. # _*_ coding: gbk _*_
  2. # @Author: Wonder
  3.  
  4. x = 10
  5.  
  6. expr = """
  7.  
  8. z = 30
  9. y = 5
  10. global x
  11. x = 18
  12.  
  13. m =10
  14.  
  15. print('x',x)
  16. print('z',z)
  17.  
  18. sum = x + y + z
  19. print(sum)
  20. """
  21. func1 = {'x': 1, 'y': 2}
  22. func2 = {'x': 3, 'y': 4}
  23. func3 = {'x': 99, 'y': 99}
  24.  
  25. def func():
  26. y = 20
  27. x = 11
  28.  
  29. exec(expr)
  30. exec(expr, func1, func2)
  31. exec(expr, func3, func1)
  32. print(func1, '\n\n\n\n')
  33. print(func2, '\n\n\n\n')
  34. print(func3)
  35.  
  36. func()

  

元类

元类是类的类,普通类是元类type的实例化对象,元类:type以及继承了type的类称为元类

元类实例化------>类,类实例化------>对象。

  1. # _*_ coding: gbk _*_
  2. # @Author: Wonder
  3.  
  4. # 正常调用类
  5. class Teach:
  6. def __init__(self, name, age):
  7. self.name = name
  8. self.age = age
  9.  
  10. @property
  11. def bark(self):
  12. print('%s 别叫' % self.name)
  13.  
  14. obj = Teach('dog', 18)
  15. print(obj)
  16. print(obj.name)
  17. obj.bark
  18.  
  19. # 通过元类,生成类。type的三要素(class_name,class_bases, class_dict)
  20. class_dict = {}
  21. exec('''
  22. def __init__(self, name, age):
  23. self.name = name
  24. self.age = age
  25.  
  26. @property
  27. def bark(self):
  28. print('%s 别叫' % self.name)
  29. ''', globals(), class_dict)
  30.  
  31. Teach2 = type('Teach', (object,), class_dict)
  32. obj1 = Teach2('horse', 17)
  33. print(obj1)
  34. print(obj1.name)
  35. obj1.bark

 执行的结果如下:---->证明(两种方式都可以生成类)

定制元类,进行控制类的创建行为

  1. # _*_ coding: gbk _*_
  2. # @Author: Wonder
  3. class Mymeta(type):
  4. def __init__(self, class_name, class_bases, class_dict):
  5. '''
  6. 此处可以对类名,类局部名称空间中的一些参数进行条件控制
  7. :param class_name:
  8. :param class_bases:
  9. :param class_dict:
  10. '''
  11. print('假装通过我,创造了类Teach')
  12.  
  13. super().__init__(class_name, class_bases, class_dict)
  14.  
  15. # 正常调用类
  16. class Teach(object, metaclass=Mymeta): # Mymeta(class_name,class_bases,class_dict)
  17. def __init__(self, name, age):
  18. self.name = name
  19. self.age = age
  20.  
  21. @property
  22. def bark(self):
  23. print('%s 别叫' % self.name)
  24.  
  25. obj = Teach('dog', 18)
  26. obj.bark  

需要注意的是,一定要写super().__init__(class_name, class_bases, class_dict)  ,重用type生成类的功能

执行结果如下图,

定制元类,进行控制类的实例化行为

  1. # _*_ coding: gbk _*_
  2. # @Author: Wonder
  3. class Mymeta(type):
  4. def __init__(self, class_name, class_bases, class_dict):
  5. print('假装通过我,创造了类Teach')
  6. super().__init__(class_name, class_bases, class_dict)
  7.  
  8. def __call__(self, *args, **kwargs): # 调用类,都会先触发__call__, 实例化的三部曲
  9. # 1、造一个空对象
  10. obj = object.__new__(self)
  11. # 2、初始化对象
  12. self.__init__(obj, *args, **kwargs)
  13. # 3、返回一个对象
  14. print('假装通过我来实例化对象')
  15. return obj
  16.  
  17. # 正常调用类
  18. class Teach(object, metaclass=Mymeta): # Mymeta(class_name,class_bases,class_dict)
  19. def __init__(self, name, age):
  20. self.name = name
  21. self.age = age
  22.  
  23. @property
  24. def bark(self):
  25. print('%s 别叫' % self.name)
  26.  
  27. obj = Teach('dog', 18)
  28. 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. day12 python函数名的应用 闭包 迭代器

    day12 python   一.函数名的应用(是第一类对象)     函数名的命名规范和变量是一样的     函数名其实就是变量名 def func():     print('i am funct ...

  2. 48th Numpy 常见数组

    1.全0数组 np.zeros(shape, dtype=float, order='C') 指定长度的一维数组 >>> np.zeros(5) array([ 0.,  0.,  ...

  3. pip飞起来了

    这里说下Windows下的修改方法,看了网上很多的教程发现都不行,尝试了好久终于发现了可行的方法. 找到python安装目录下的:\Lib\site-packages\pip\models\index ...

  4. 查看tomcat的版本号

    本经验主要介绍在windows下,如何查看tomcat的版本号. 工具/原料 安装了tomcat server的操作系统. 一.绿色版tomcat版本查看--命令catalina version 或者 ...

  5. MariaDB 选择查询

    在本章中,我们将学习如何从表中选择数据. SELECT语句检索所选行. 它们可以包括UNION语句,排序子句,LIMIT子句,WHERE子句,GROUP BY ... HAVING子句和子查询. 查看 ...

  6. 常见算法和数据结构存在的坑(updating)

    数组: c++数组下标都+5会稳. 50005000的别开60006000. 二分: 实数二分可能因为神马精度问题出现了不满足二分序的情况,要小心. 注意二分完后,不能直接用当前数组里存的值,要pd( ...

  7. 【NOIP2019模拟11.01】Game(贪心+线段树)

    Description: ​ 小 A 和小 B 在玩一个游戏,他们两个人每人有

  8. 关于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 ...

  9. python 标准模块和第三方模块

    >>> help('modules') Please wait a moment while I gather a list of all available modules... ...

  10. Java Freemarker生成word

    Java Freemarker生成word freeMaker 简介: FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页.电子邮件.配置文件.源代 ...