zoukankan      html  css  js  c++  java
  • Day 5-7 exec 和元类的创建.

    exec方法

    元类

    exec(str_command,globals,locals)
    参数1:字符串形式的命令
    参数2:全局作用域(字典形式). 如果不指定,默认globals
    参数3:局部作用(字典形式).如果不指定.默认locals

    可以把exec命令的执行当成是一个函数的执行,会将执行期间产生的名字存放于局部名称空间中

     1 g = {}  # 定义2个空字典
     2 l = {}    
     3 
     4 
     5 exec("""
     6 global x,y
     7 x = 100
     8 y = 20
     9 z=30
    10 """, g, l)
    11 
    12 print(g)  # 输出的是一个全局字典变量,里面肯定包括了x:100,y:20
    13 print(l) # 局部字典变量.{'z': 30}

    python中一切皆是对象,类本身也是一个对象,当使用关键字class的时候,python解释器在加载class的时候就会创建一个对象(这里的对象指的是类而非类的实例),因而我们可以将类当作一个对象去使用,同样满足第一类对象的概念,可以:

    把类赋值给一个变量

    把类作为函数参数进行传递

    把类作为函数的返回值

    在运行时动态地创建类

    一切皆对象,对象可以怎么用?对象的特点:
    1、都可以被引用,x=obj
    2、都可以当作函数的参数传入
    3、都可以当作函数的返回值
    4、都可以当作容器类的元素,l=[func,time,obj,1]

    什么是元类?

    元类是类的类,是类的模板

    元类是用来控制如何创建类的,正如类是创建对象的模板一样,而元类的主要目的是为了控制类的创建行为

    元类的实例化的结果为我们用class定义的类,正如类的实例为对象(f1对象是Foo类的一个实例,Foo类是 type 类的一个实例)

    type是python的一个内建元类,用来直接控制生成类,python中任何class定义的类其实都是type类实例化的对象

     1 # 产生类的类,称之为元类.
     2 #类的创建方法之一: class 创建
     3 class Chinese:
     4     def __init__(self, name, age):
     5         self.name = name
     6         self.age = age
     7 
     8     def tell_info(self):
     9         print("name:%s, age:%s" % (self.name,self.age))
    10 
    11 
    12 p1 = Chinese("jack",18)
    13 
    14 p1.tell_info()
    15 
    16 #类的创建方法之二:type创建
    17 #类的三要素:
    18 class_name = "Chinese" # 类名
    19 class_base = (object,) # 继承.父类
    20 #类体代码
    21 class_body = """
    22 def __init__(self, name, age):
    23     self.name = name
    24     self.age = age
    25 
    26 def tell_info(self):
    27     print("name:%s, age:%s" % (self.name,self.age))
    28 """
    29 class_dict = {}
    30 exec(class_body,globals(), class_dict)  # 创建一个类的字典
    31 print(class_dict)
    32 Chinese1 = type(class_name, class_base, class_dict)
    33 p2 = Chinese1("Alex", 39)
    34 p2.tell_info()

    手动模拟class创建类的过程):将创建类的步骤拆分开,手动去创建

    第一步:

     1 #准备工作:
     2 
     3 #创建类主要分为三部分
     4 
     5   1 类名
     6 
     7   2 类的父类
     8 
     9   3 类体
    10 
    11 
    12 #类名
    13 class_name='Chinese'
    14 #类的父类
    15 class_bases=(object,)
    16 #类体
    17 class_body="""
    18 def __init__(self,name,age):
    19     self.name=name
    20     self.age=age
    21 def tell_info(self):
    22     print("name:%s, age:%s" % (self.name,self.age))
    23 """

    第二步:

    (先处理类体->名称空间):类体定义的名字都会存放于类的名称空间中(一个局部的名称空间),我们可以事先定义一个空字典,然后用exec去执行类体的代码(exec产生名称空间的过程与真正的class过程类似,只是后者会将__开头的属性变形),生成类的局部名称空间,即填充字典.

    class_dic={}
    exec(class_body,globals(),class_dic) # 把生成的类的局部名称空间填充到class_dict中.

    第三步:

    1 Chinese = type(class_name, class_base, class_dict) #生成一个Chinese的类
    2 p2 = Chinese("jack", 39)
    3 p2.tell_info()   # 和class生成的类一样可以调用

    type 接收三个参数:

    • 第 1 个参数是字符串 ‘Foo’,表示类名
    • 第 2 个参数是元组 (object, ),表示所有的父类
    • 第 3 个参数是字典,这里是一个空字典,表示没有定义属性和方法
  • 相关阅读:
    mysql--表数据的操作
    mysql--增删改查
    mysql--约束条件
    Mysql--基本配置
    Mysql--数据表
    Mysql--数据库的操作
    位运算的应用
    读书笔记--模板与泛型编程
    读书笔记六
    读书笔记五
  • 原文地址:https://www.cnblogs.com/lovepy3/p/9000150.html
Copyright © 2011-2022 走看看