元类

什么是元类:
元类是创建类的类,自定义的类默认为type类实例化来的
如何用元类:
类是由三部分组成,类名,类的父类们,类的名称空间
补充:exec()
三个参数,1.字符串形式的python代码
2.全局名称空间globals 3.局部名称空间locals
代码中未有使用global声明的变量会放入局部名称空间

使用元类创建类
type (self,class_name,class_bases,class_dict)

为什么用元类:
1.使用元类可以控制类的创建过程,通过__init__()
可以控制类名大写,必须有文档注释

class Mytype(type):
    def __init__(self,class_name,class_bases,class_dict):
        if not class_name.istitle():
            raise TypeError("类名首字母必须大写")
        if not self.__doc__:
             raise TypeErroe("必须有文档注释")
class person(metaclass = Mytype):
        pass 

ps:必须继承type才能称为元类,否则只是自定义类

2.使用元类可以控制类的调用
补充__call__:在对象被调用时自动触发,类为元类的对象,故当类被调用时会触发元类中的__call__函数执行
故控制类的调用,实际就是更新元类的__call__方法

class Mytype(type):
    def __call__(self,*args,**kwargs):#就是我们产生对象发生的三件事①创建空对象②将空对象和参数传给初始化函数③返回对象
        obj = object.__new__(self)#创建空对象
        self.__init__(obj,*args,**kwargs)#初始化空对象
        return obj#返回初始化后的对象
class person(metaclass = Mytype):
        pass           

单例模式:
只有一个实例,即无论如何创建实例都指向了一片内存地址
为什么要用单例模式:
数据只有一份且共享,此时创建多个实例都是一样的数据,但指向的内存空间不同,耗内存,故使用单例模式

单例模式的实现:

class Mytype(type):
    obj = None
    def __call__(self,*args,**kwargs):
        if  not Mytype.obj:
            obj = object.__new__(self)
            self.__init__(obj,*args,**kwargs)
            Mytype.obj = obj
        return  Mytype.obj
class person(metaclass = Mytype):
        pass
原文地址:https://www.cnblogs.com/robert-zhou/p/10145118.html