元类介绍

'''
储备知识exec
参数1:字符串形式的命令
参数2:全局作用域(字典形式),如果不指定默认就使用globals()
参数3:局部作用域(字典形式),如果不指定默认就使用locals()
'''
g = {
'x': 1,
'y': 2

}
l = { }

exec('''
global x,m
x = 10
m = 100

z =3
''',g,l)
print(g)
print(l) # 执行结果:{'z': 3}

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

# 类也是对象,Foo=type(...)
class Foo:
pass

obj = Foo()
print(type(obj)) # 执行结果:<class '__main__.Foo'>
print(type(Foo)) # 执行结果:<class 'type'>

class Bar:
pass


print(type(Bar)) # 执行结果:<class 'type'>
# 产生类的类称之为元类, 默认所以用class定义的类,他们的元类是type
# 定义类的两种方式:
# 方式一:class


class Chinese: # Chinese=type(...)
country = 'china'

def __init__(self,name,age):
self.name=name
self.age=age

def talk(self):
print('%s is talking'%self.name)


print(Chinese) # 结果:<class '__main__.Chinese'>
obj = Chinese('kingforn',18)
print(obj.__dict__)
'''执行结果:
{{'name': 'kingforn', 'age': 18}
'''

# 方式二: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 talking'%self.name)

''' # 类体
class_dict = {}
exec(class_body,globals(),class_dict)
''' print(class_dict) # {'country': 'china', '__init__': <function __init__ at 0x000001C0DBB01AE8>,
'talk': <function talk at 0x000001C0DBB01C80>}

'''
Chinese1= type(class_name, class_bases, class_dict)
print(Chinese1) # 结果:<class '__main__.Chinese'>
obj1=Chinese1('alex',38)
print(obj1.__dict__)
'''执行结果:
{'name': 'alex', 'age': 38}
'''
原文地址:https://www.cnblogs.com/kingforn/p/11354051.html