元类

什么是元类?

         可以实例化出类的类叫元类。

类的组成:

  1. 类名 2.基类们 3.类的名称空间(执行类体代码而得到的)
案例:
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,{},class_dict)
bases=(object,)
res=Teacher=type(class_name,bases,class_dict)
print(res)

一个类没有声明自己的元类时,默认下元类是type

自定义元类:只有继承了type类才能称为一个元类,不然就是一个普通类

class Mymeta(type):
    def __init__(cls,class_name,bases,namespace):
        pass

--ini--控制类的创建

--call­--的执行时机是调用对象的时候

调用一个类,创建出一个空对象,调用一个—init—初始化  返回新对象 (可以添加额外的业务逻辑)

class Teacher(type):
    def __call__(self, *args, **kwargs):
        obj=object.__new__(self)
        obj.__init__(*args,**kwargs)
        return obj

class Foo(metaclass=Teacher):
    def __init__(self,name):
        self.name=name

t=Foo('张三')
print(t)

         字符串的判断方法:1.type(参数)=str  2.isinstance(参数,str)

什么是单例?

         指单个实例,一个类只能有一个实例对象

为什么使用单例?

         当一个类的实例中的数据不会变化时,就使用单例

案例:

class MyMetaClass(type):
    instance = None
    def __call__(cls, *args, **kwargs):
        if not MyMetaClass.instance:
            MyMetaClass.instance = object.__new__(cls)
            print("创建新的播放器对象!")
            MyMetaClass.instance.__init__(*args, **kwargs)
        return MyMetaClass.instance


class CDPlayer(metaclass=MyMetaClass):
    def play(self,music):
        print("切换音乐",music)
    def __init__(self,music_name):
        self.music_name = music_name

p1 = CDPlayer("你发如雪!")
# p2=CDPlayer("人生如梦")
p1.play("菊花台")
原文地址:https://www.cnblogs.com/zhouhai007/p/10029047.html