Python 元类

  1. 什么是元类?
    元类就是创建类的类,type是最原始的一个元类。(实例是实例化的类,而类是元类的实例)
    python中一切皆为对象,所有的类都直接和间接的是type类的实例对象。
    另外,我们知道object是所有类的父类,同时object又是type类的实例对象。

  2. 元类中的特殊方法

__new__(cls,name,base,attr)
    元类中, __new__ 是用来生成类的,只会调用一次

__init__(self, name, *args, **kwargs)
    该元类的实例(也就是普通类)创建后被调用,用于为初始化实例的,只会调用一次
    
__call__(self, *args, **kwargs)
    元类创建的实例(也就是普通类),构造普通类的对象时调用,每次都会执行
  1. 元类如何创建类
在元类中是通过 __new__ 函数生成类的, 该函数是静态函数。

1. type(类名称[str], 父类[()],类的属性/函数[dict])

# 创建临时类
2. type.__new__(元类[type], 类名称[str], 父类[()],类的属性/函数[dict])
  1. 如何自定义元类?
# python3
class XXType(type): # 自定义元类必须要显式继承type类
    pass
    
class XXClass(metaclass=XXType): # 设置类的元类
    pass
 
# python2
# 设定 __metaclass__
  1. 在单例模式中的应用
import threading

# 创建类时,type的init方法自动执行,类() 执行type的call方法(这个方法中会依次执行类的new、init方法
class SingletonType(type):
    _instance_lock = threading.Lock()

    def __call__(cls, *args, **kwargs):
        if not hasattr(cls, "_instance"):
            with SingletonType._instance_lock:
                if not hasattr(cls, "_instance"):
                    cls._instance = super(SingletonType, cls).__call__(*args, **kwargs)
        return cls._instance

class Foo(metaclass=SingletonType):
    def __init__(self):
        print(1)

# 创建对象时,类的init方法自动执行,对象() 执行类的call方法
obj = Foo()
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。