学习python第十二天 类的双下划线方法,new方法,单例模式

类的双下划线方法:比如之前学的__init__()

__len__() 

__hash__()

__eq__()

__item__()

以上用的比较少,下面的比较重要:

str   repr:改变字符串的显示格式

 

 

del析构方法:当对象在内存中释放的时候自动触发

class Person:

  def __init__(self,name):

    self.name = name

  def __del__(self):

    print("被释放了……")

p = Person("jack")

直接运行,程序结束的时候自动执行__del__()方法。

del p      #或者直接删掉此对象也会执行del方法。也就是说在对象消失的时候执行  

 

__new__()方法:

new方法是在__init__()构造函数之前执行。负责执行__init__    ,进行一些实例初始化之前的工作。重写__new__()之后init不会自己调用,必须return才行

class Person(object):

  def __init__(self,name):

    self.name = name

  def __new__(cls,*args,**kwargs):    #负责执行init,进行一些实例初始化之前的工作

    print(cls,args,kwargs)

p = Person("jack")    #此时可以直接执行,执行的是new方法

print(p.name)    #判断能否执行init方法,报错不能。因为重写new方法之后没有return。

-----------需要加上return------------

  def __new__(cls,*args,**kwargs):    

    print(cls,args,kwargs)

    return object.__new__(cls)    #返回父类的new。    object是所有类的父类,定义类名的时候自动继承,写不写出来都可以。class Person(object):

 

new方法创建单例模式:单例模式就是只生成一个实例。比如系统调用打印机,不管同时开几个都是一个程序排队打印,而不是创建了许多程序

class Printer(object):
task = [] #任务列表

def __init__(self, name): #name是调用打印机的程序名
self.name = name

def add_task(self, job):
self.task.append(job)
print("[%s] 添加任务[%s] 到打印机,总任务数为[%s]" %(self.name, job, len(self.task)))


obj1 = Printer("word")
obj2 = Printer("pdf")
obj3 = Printer("excel")

obj1.add_task("word file")
obj2.add_task("pdf file")
obj3.add_task("excel file")

print(obj1, obj2, obj3) #此时三个实例的内存地址不同,代表生成了三个实例

#生成三个实例占空间,所以要生成一个实例就好在类中添加new方法


class Printer(object):
task = []
instance = None

def __init__(self, name):
self.name = name

def add_task(self, job):
self.task.append(job)
print("[%s] 添加任务[%s] 到打印机,总任务数为[%s]" %(self.name, job, len(self.task)))

def __new__(cls, *args, **kwargs): #作用:只有第一次实例化的时候正常实例化,之后实例化都会调用第一个实例而不会创建新的实例
if cls.instance is None:
# 进行正常实例化,并把实例化之后的实例存在cls.instance中
obj = object.__new__(cls) #实例化过程
print("obj:",obj)
cls.instance = obj #把实例好的对象存下来
return cls.instance #以后每次实例化,直接返回第一次存的实例对象



obj1 = Printer("word")
obj2 = Printer("pdf")
obj3 = Printer("excel")

obj1.add_task("word file")
obj2.add_task("pdf file")
obj3.add_task("excel file")

print(obj1, obj2, obj3) #此时内存地址都相同,代表只有一个实例
print(obj1.name, obj2.name, obj3.name) #由于只有一个实例,最后传入的name为Excel,所以打印出来的都是Excel

这个单例模式还需要多消化一下,弄清楚其中的cls,object,self代表着什么才行
posted @ 2021-04-09 11:37  筱宇衡  阅读(166)  评论(0编辑  收藏  举报