元类

元类

一、exec

exec是python内置函数,能够将字符串的代码添加到自定义的名称空间中python

语法:exec(字符串形式的python代码,全局名称空间,局部名称空间)函数

字符串形式的代码是加载到自定义的名称空间中,能够在字符串名称空间中使用global将一些属性和方法引入自定义的全局名称空间中code

名称空间是一个字典形式的对象

# 字符串形式的代码
code = '''

x = 10
y = 20

def func():
	pass
def __init__():
	pass
'''

# 自定义的全局名称空间
global_dic = {'z':100}

# 自定义的局部名称空间
local_dic = {'t':300}
print(global_dic)
print(local_dic)
exec(code,global_dic,local_dic)
print(code)
print(global_dic)
print(local_dic)  # {'t': 300, 'x': 10, 'y': 20, 'func': <function func at 0x00000123A6602558>, '__init__': <function __init__ at 0x00000123A6602B88>}

二、元类

一、什么是元类

类的类就是type,type就是元类字符串

type是python内置的元类get

二、为何要使用元类

元类能够控制类的建立过程,能够经过自定义的一个元类来控制建立的类的过程it

三、怎么使用元类

# 自定义一个元类
class MyMetaClass(type):
    # 控制类的建立,重写type中的__init__
    def __init__(self, class_name, class_base, class_dict):
        # 控制建立类时首字母必须大写
        if not class_name.istitle():
            raise NameError('类的首字母必需要大写!!')
        # 控制建立类时必需要写注释
        if not class_dict.get('__doc__'):
            raise TypeError('定义必需要写注释!!')
        # 必需要将从新定义__init__返回给type中的__init__
        super().__init__(class_name, class_base, class_dict)


# 使用自定义元类(类名,基类,类的名称空间)来产生类
class User(object, metaclass=MyMetaClass):
    '''
    注释必需要写啊!
    '''
    def __init__(self):
        pass
    x = 10

# 调用类产生对象
obj = User()
print(obj)
为何调用类就会产生一个空对象:内部执行了__ new__

为何必定会执行__ new__:实际上是type内部调用了一次__call__,由__call__来帮你调用__new__产生新的空对象,全部元类中的__call__ 就是建立类的过程
class MyMetaClass(type):
    def __init__(self,class_name,class_base,class_dict):
        if not class_name.istitle():
            raise NameError('类定义必须首字母大写')
        super().__init__(class_name,class_base,class_dict)
    # 模拟__call__建立类的过程
    def __call__(self,*args,**kwargs):
        # 创造一个新空对象
        obj = object.__new__(self)
        # 调用类时,__call__会立马调用user.__init__,而且会将obj连同参数一并传入__init__
        self.__init__(obj,*args,**kwargs)
        # 返回一个真正的对象
        return obj
相关文章
相关标签/搜索