元类介绍

#储备知识 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)

posted on 2019-01-12 21:24  别离  阅读(215)  评论(0编辑  收藏  举报

导航