元类认知

python 一切皆对象

元类构造方法

class Foo:
    pass

print(type(Foo))

# 一般类默认都是由type创建
Base = type('Base',(object,),{'name':'alex','func1':lambda x:x+1})
'''
:param 第一个参数是类名  第二个是一个元组 里边写着它集成的类 ,第三个参数是属性和方法

'''
print(Base)

 

也可以通过meat_class指定由谁来创建

class Mytype(type):

    def __init__(self,*args,**kwargs):
        print('创建前')
        super().__init__(*args,**kwargs)
        print('创建后')

class Foo(object,metaclass=Mytype):

    city = 'bj'

    def func(self,x):
        return x+1

根据元类创建的单例模式

在类实例化的时候会先执行metaclass类的__call__方法

class Singleton(type):
    _instances = {}
    def __call__(cls, *args, **kwargs):  # 他的实例化出来的类实例化时调用了这个方法,
        if cls not in cls._instances: 
            # 如果这个来没有实例化对象,就去执行type的__call__方法,并且把实例存储在cls._instances中
            cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
        return cls._instances[cls]  # 返回实例
 
class MyClass(metaclass=Singleton):
   pass
 
a = MyClass()

 

posted on 2018-05-02 15:40  心如沚水  阅读(210)  评论(0编辑  收藏  举报