类的双下划线方法:比如之前学的__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代表着什么才行