上节课复习
1.什么是元类
元类是我们自定义的类,即我们用class定义的类本质
就是在实例化元类
class Foo: #Foo=元类('类名',(object),class_dic)
pass
obj=Foo()
2.为何要用元类+如何用?
2.1控制class定义类的过程
class Mymeta(type):
def __init__(self,class_name,class_bases,class_dic):
#控制逻辑
super().__init__(class_name,class_bases,class_dic)
class Foo(object,metaclass=Mymeta): #Foo=Mymeta('Foo',(object,),{'x':1,.....})
x=1
2.2 控制对象(指的就是Foo的对象)的产生过程
class Mymeta(type):
def __call__(self,*args,**kwargs):
obj=self.__new__(self) #self=Foo
self.__init__(obj,*args,**kwargs)
return obj
class Foo(objec,metaclass=Mymeta): #Foo=Mymeta(....)
def __init__(self,x,y):
self.x=x
self,y=y
obj=Foo(x=1,y=2)
01 元类补充
class Mymete(type):
n=444
def __call__(self,*args,**kwargs):
obj=self.__new__(self)
self.__init__(obj,*args,**kwargs)
return obj
class A(object):
n=333
class B(A):
n=222
class Foo(B,metaclass=Mymeta):
n=111
def __init__(self,x,y):
self,x=x
self,y=y
print(Foo.n)
查找顺序:
1.先对象层:Foo->B->A->object
2.然后元类层:Mymeta->type
print(type(object))
obj=Foo()
print(obj.__dict__)
03 单例模式
1.什么是单例模式
单例模式:基于某种方法实例化多次得到实例是同一个
2.为何用单例模式
当实例化多次得到的对象中存在的属性都一样的情况,应该将多个对象指向同一个内存,即同一个实例
单例模式:基于某种方法实例化多次得到实例是同一个
2.为何用单例模式
当实例化多次得到的对象中存在的属性都一样的情况,应该将多个对象指向同一个内存,即同一个实例
3.如何使用:
单例模式实现方式一:
import settings
class Mysql:
__instance=None
def __init__(self,ip,port):
self.ip=ip
self.port=port
@classmethod
def from_conf(cls):
if cls.__instance is None:
cls. __instance=cls(setting.IP,settings.PORT)
return cls.__instance
obj1=Mysql.from_conf()
obj2=Mysql.from_conf()
obj3=Mysql.from_conf()
print(obj1)
print(obj2)
print(obj3)
obj4=Mysql('10.10.10.11',3307)
print(obj4)
单例模式实现方式二:
import settings
def singleton(cls):
cls.__instance=cls(settings.IP,settings.PORT)
def wrapper(*args,**kwargs):
if len(args) == 0 and len(kwargs) == 0:
return cls.__instance
return cls(*args,**kwargs)
return wrapper
@singleton #Mysql=singleton(Mysql) #Mysql=wrapper
class Mysql:
def __init__(self,ip,port):
self.ip=ip
self.port=port
obj1=Mysql() #wrapper()
obj2=Mysql() #wrapper()
obj3=Mysql() #wrapper()
print(obj1 is obj2 is obj3)
print(obj1)
print(obj2)
print(obj3)
obj4=Mysql('1.1.1.4',3308)
print(obj4)
单例模式实现方式三:
import settings
class Mymeta(type):
def __init__(self,class_name,class_bases,class_dic): #self=Mysql
super(Mymeta,self).__init__(class_name,class_bases,class_dic )
self.__instance=self.__new__(self) #造出一个Mysql的对象
self.__init__(self.__instance,settings.IP,settings.PORT) #从配置文件中加载配置完成Mysql对象的初始化
# print(self.__instance)
# print(self.__instance.__dict__)
def __call__(self, *args, **kwargs): #self=Mysql
if len(args) == 0 and len(kwargs) == 0:
return self.__instance
obj=self.__new__(self)
self.__init__(obj,*args,**kwargs)
return obj
class Mysql(object,metaclass=Mymeta): #Mysql=Mymeta(...)
def __init__(self,ip,port):
self.ip=ip
self.port=port
obj1=Mysql()
obj2=Mysql()
obj3=Mysql()
obj4=Mysql('10.10.10.11',3308)
print(obj1)
print(obj2)
print(obj3)
print(obj4)