什么是元类?
可以实例化出类的类叫元类。
类的组成:
- 类名 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("菊花台")