32-元类

一、元类介绍

什么是元类呢?一切源自于一句话:python中一切皆为对象。

元类就是用来实例化产生类的类
关系:元类---实例化---->类(People)---实例化---->对象(obj)

让我们先定义一个类,然后逐步分析

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

    def say(self):
        print('%s:%s' %(self.name,self.name))
print(People.__dict__)

# 如何得到对象
# obj=调用类()
obj=People('egon',18)
print(type(obj))
# 如果说类也是对象
# People=调用类(。。。)

# 查看内置的元类:
# 1、type是内置的元类
# 2、我们用class关键字定义的所有的类以及内置的类都是由元类type实例化产生
print(type(People))         # <class 'type'>
print(type(int))            # <class 'type'>

二、class关键字创造类People的步骤

类有三大特征

1、类名

# 1、类名
class_name="People"

2、类的基类

# 2、类的基类
class_bases=(object,)

3、执行类体代码拿到类的名称空间

# 3、执行类体代码拿到类的名称空间
class_dic={}
class_body="""
def __init__(self,name,age):
    self.name=name
    self.age=age

def say(self):
    print('%s:%s' %(self.name,self.name))
"""

此时会使用一个exec函数来实现类名称空间字典的创建

exec(class_body,{},class_dic)
print(class_dic)        # {'__init__': <function __init__ at 0x00000223DD72B280>, 'say': <function say at 0x00000223DD72B160>}  

exec()补充:

#exec:三个参数

#参数一:包含一系列python代码的字符串

#参数二:全局作用域(字典形式),如果不指定,默认为globals()

#参数三:局部作用域(字典形式),如果不指定,默认为locals()

#可以把exec命令的执行当成是一个函数的执行,会将执行期间产生的名字存放于局部名称空间中
g={
    'x':1,
    'y':2
}
l={}

exec('''
global x,z
x=100
z=200

m=300
''',g,l)

print(g) #{'x': 100, 'y': 2,'z':200,......}
print(l) #{'m': 300}

4、调用元类

People=type(class_name,class_bases,class_dic)

猜你喜欢

转载自www.cnblogs.com/zhubincheng/p/12708672.html
今日推荐