__new__方法用于定义建立对象时执行的操做,__new__方法仅仅为用户提供一个建立对象时干预的入口,真正执行建立对象的操做由object类中的__new__方法完成。python
定义__new__方法是对 object 类中的方法的重写,重写该方法时必须再次调用 object 类中的__new__方法.程序员
def __new__(cls, *args, **kwargs):
if cls.__instance is None:
cls.__instance = object.__new__(Printer)
return cls.__instance
复制代码
__new__方法在建立对象时自动运行,无需手工执行调用该方法。
复制代码
del操做的实质是断开变量与内存数据之间的引用,操做del执行后等同于对应变量未进行过定义。app
__del__方法用于定义对象不存在任何引用时执行的操做。当对象断开了与最后一个变量之间的引用关系时,将执行该对象的__new__方法。spa
1.当手工执行断开变量与对象的最后一个引用时执行,即del操做code
2.当程序执行完毕时,全部变量对应的引用都断开,此时执行,即退出程序对象
__del__方法在对象断开与最后一个变量之间的引用关系时自动执行,无需手工执行调用该方法。索引
对象引用地址判等:
对象名 is 对象名 或 变量名 is 变量名
数据引用地址断定:
数据 is 数据
注:判等操做的结果是True或False
复制代码
控制一个类只能建立出单个实例对象。队列
class Printer:
__instance = None
def __new__(cls, *args, **kwargs):
if cls.__instance is None:
cls.__instance = object.__new__(Printer)
return cls.__instance
复制代码
""" 案例:办公室的打印机 一台打印机能够服务于一个办公室中全部的人,完成他们的打印任务。 分析: 1.打印机:将要打印的任务添加到打印的任务队列中,真正的打印操做 2.经理:将要打印的操做加入打印机中 3.员工:将要打印的操做加入打印机中 """
class Manager:
def use_printer(self,info,pr):
pr.add_task(info)
class Staff:
def use_printer(self,info,pr):
pr.add_task(info)
class Printer:
"""典型的单例模式"""
__instance = None
def __new__(cls, *args, **kwargs):
"""经过重写__new__方法来实现只建立一个对象"""
if cls.__instance is None :
cls.__instance = object.__new__(Printer)
return cls.__instance
def __init__(self,list_print = []):
self.list_print = list_print
def add_task(self,info):
"""添加打印信息到打印队列中"""
self.list_print.append(info)
def print(self):
print(self.list_print)
# 程序员A:
pr1 = Printer() # 建立打印机对象
m1 = Manager() # 建立一个经理对象
m1.use_printer("hello",pr1)
# 程序员B:
pr2 = Printer()
st1 = Staff()
st1.use_printer("itcast",pr2)
# 程序员B1:
pr3 = Printer()
st2 = Staff()
st2.use_printer("itcast666",pr3)
# 程序员C:
pr = Printer()
pr.print()
复制代码