魔法方法总是被双下划线包围 例如_ _ init _ _
今天介绍构造和析构:
1. _ _ init_ _(self[,…]) 相当于构造方法:
init方法必须返回一个None对象,不能使用return语句!
class RecTangle:
def __init__(self,length,width):
self.length=length
self.width=width
def getPerl(self):
return(self.length+self.width)
def getArea(self):
return(self.length*self.width)
rec =RecTangle(5,4)
print(rec.getArea())
print(rec.getPerl())
但是对象实例化真正第一个调用的魔法方法是: _ _ new _ _ (class[,….])
↓
2. _ _ new _ _ (class[,….]):如果class,也就是这个类,后面有参数,则后面的参数会原封不动的返回给init
new必须返回一个实例对象,new返回的是传入第二个参数时候返回的关于第一个参数的实例化对象
那么什么时候会需要重定义new呢?
↓
当继承一个不可变类型,但是又需要修改的时候,需要重定义new:
class CapStr(str): #str是一个不可修改的父类
def __new__(cls,stringValue):
string=str(stringValue).upper() #new必须返回一个实例对象
return str.__new__(cls,string) #返回str构造后的实例对象 → 一个大写的字符串
a = CapStr('i love FishC')
print(a) # a此时是一个大写的字符串(实例对象)
那么构造以后,怎么析构我们的类呢?
↓
3. del__(self) 析构器:当一个对象被销毁的时候,垃圾回收机制的时候会自动调用
但是不代表 del x = x.del()方法!!!
class C:
def __init__(self):
print('init被调用了...')
def __del__(self):
print('del被调用了...')
c1=C()
c2=c1
c3=c2
del c1
print('=======\n')
del c3
print('============\n')
del c2