表面上是: class + 类名 会把类构造出来
实际上是: 元类实例化产生类 这个对象
# 类实例化产生对象, 一定是: 类名()
# Person 类是有type实例化产生,传一堆参数
# type() 调用类的__init__方法
# type()
# 如果想要控制类的产生过程,就要用 type(object_or_name, bases, dict) 这个类型 传三个参数
# object_or_name: 类的名字, 是一个字符串
# bases: 是它的所有父类(基类) 要用元组的形式Tuple
# dict: 是它的名称空间 要用字典的形式
class Person:
school = 'FYZX'
def __init__(self, name):
self.name = name
def score(self):
print("分数为100")
p = Person('nick')
print(p.name)
通过type来直接产生类, 不用class关键字了
l = {}
exec('''
school = 'FYZX'
def __init__(self, name):
self.name = name
def score(self):
print("分数为100")
''', {}, l)
# 也可以手动传值
# def __init__(self, name):
# self.name = name
# type('Person', (object,), {'school': 'FYZY', '__init__': __init__})
Person = type('Person', (object,), l)
print(Person.__dict__)
p = Person('nick')
print(p.name)
print(p.__dict__)
class关键字的本质原理:
class 底层就是调用type来实例化产生类 (类其实也是个对象)
exec()
与eval()
的区别
# exec(object, globals, locals)
# object其实就是一个字符串
# globals是把这个字符串的内容转换成全局名称空间(globals)
# locals是把这个字符串的内容转换成局部名称空间(locals)