关于python元类

#class本质

class_name = "Teacher"
class_body = """
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def say(self):
        print('%s says welcome to the Beijing' %self.name)
"""
class_dict = exec(class_body)
bases = (object,)
Teacher = type(class_name,class_body,bases)

指定元类

class MyMate(type):
    def __init__(self,name,bases,dic):
        print("run")
        if not dic.get("__doc__"):
            raise TypeError("类必须有文档注释!")
        if not name.istitle():
            raise TypeError("类名必须大写开头!")
        super().__init__(name,bases,dic)


class Foo(object,metaclass=MyMate): pass

元类实现单例

class MyMeta(type):
    __instance = None
​
    def __init__(self,name,bases,dic):
        if not self.__instance:
            self.__instance = object.__new__(self)
            self.__init__(self.__instance)
​
        super().__init__(name, bases, dic)
​
​
    def __call__(cls):
        return cls.__instanceclass Player(metaclass=MyMeta):
    def __init__(self):
        print("创建播放器了")
        
Player()
Player()

 

posted @ 2019-04-12 11:16  SwZ1886  阅读(231)  评论(0编辑  收藏  举报