• 元类介绍


    #储备知识 exec
    #参数1:字符串形式的命令
    #参数2:全局变量 (字典形式) 如果 不指定就使用globals
    #参数3:局部变量 (字典形式) 如果不指定就使用locals

    g = {
    'x':1,
    'm':2
    }
    l = {}
    exec('''
    global x,m
    x =10
    m = 20

    z = 3

    ''', g, l)
    print(l) #上面的’z‘没有指全局就直接归属到局部变量中
    print(g) #因为exec里面声明了'x, m为全局, 故归属到全局变量


    #在python中一切皆对象,对象可以怎么用
    #都可以被引用 obj = class, 函数 = func()
    #都可以当做函数的参数
    #都可以当做参数的返回值
    #都可以当做容器类型的元素 如 :列表, 字典, 集合, 元祖


    class Foo: #类也是对象
    pass
    obj = Foo()
    print(type(obj))
    print(type(Foo)) #Foo的对象是 元类‘type’

    #产生类的类称之为元类, 默认所有class定义出来的类 的元类都是type


    #定义类的两种方式:
    #方式1:class
    class Chinese: #这个chineses = type(......)就是type实例化过来的
    country = 'china'
    def __init__(self, name, age):
    self.name = name
    self.age = age
    def talk(self):
    print('%s is talk'%self.name)
    #print(Chinese)
    obj = Chinese('egon', 18)
    print(obj.name, obj.age)

    #方式2: type
    #定义类的三要素: 类名, 类的基类, 类的名称空间
    class_name = 'chinese'# 类名
    class_bases = (object,)# 类的父类 默认object
    class_body = '''
    country = 'china'
    def __init__(self, name, age):
    self.name = name
    self.age = age
    def talk(self):
    print('%s is talk'%self.name)
    '''
    class_dic = {} #类的局部名称空间

    exec(class_body, globals(), class_dic)
    print(class_dic)

    Chinese1 = type(class_name, class_bases, class_dic)
    #print(Chinese1)
    obj1 = Chinese1('egon', 25)
    print(obj1.name, obj1.age)
  • 相关阅读:
    文佳夹之删除
    猜谜小游戏
    python小知识点
    【bzoj4516】[Sdoi2016]生成魔咒 后缀数组+倍增RMQ+STL-set
    【bzoj3362/3363/3364/3365】[Usaco2004 Feb]树上问题杂烩 并查集/树的直径/LCA/树的点分治
    【poj1741】Tree 树的点分治
    【bzoj2946】[Poi2000]公共串 后缀数组+二分
    【bzoj2157】旅游 树链剖分+线段树
    【bzoj2743】[HEOI2012]采花 树状数组
    【bzoj2705】[SDOI2012]Longge的问题 欧拉函数
  • 原文地址:https://www.cnblogs.com/yuexijun/p/10261084.html
Copyright © 2020-2023  润新知