python中类的构造和构析魔法方法
__new__()方法(构造方法):
class Foo(object): def __new__(cls,*args,**kwagrs): print(‘cls的值是:‘,cls) print(‘cls的类型是:‘,type(cls)) return super().__new__(cls,*args,**kwagrs) a=Foo() cls的值是:cls的类型是:
该方法第一个参数cls是当前正在实例化的类,可以看出,系统自动给变量cls赋值为当前类Foo
1、如果类中没有重写__new__()方法,Python默认是调用该类直接父类的__new__()方法来构造该类的实例,如果该类的父类也没有重写__new__(),那么将一直按此规矩追溯至object的__new__()方法,因为object是所有新式类的基类。
2、如果类中重写了__new__()方法,那么可以自由选择任意一个的其他类的__new__()方法来制造实例,只要它们不会造成递归死循环。
3、任何类的__new__()方法不能调用自身的__new__()来制造实例,因为这会造成死循环。
4、Bar.__new__(Foo,agrs,*kwagrs) ,指:使用哪个类(bar)的__new__()方法去制造谁的(Foo)实例对象。
5、__new__()方法会返回cls的实例,然后该类的__init__()方法会接收这个实例(即self)作为第一个参数,然后依次传入__new__ ()方法中接收的除cls之外的其他参数。
6、如果__new__()没有返回cls(即当前类)的实例,那么当前类的__init__()方法是不会被调用。如果__new__()返回其他类的实例,那么只会调用被返回的那个类的构造方法。
__init__()方法(初始化方法):
class Myclass: def __init__(self, name,age): self.name = name self.age = age 在创建实例的时候,把一些我们认为必须绑定的属性填写进去,在创建实例的时候,就不能传入空的参数了,必须传入与__init__()方法匹配的参数,self变量不需要传:o = Myclass(‘MyName‘,18),__init__()不能有返回值,否则实例化的时候会报错。
__del__()方法(析构方法):
class FileObject: def __init__(self,filename=‘test.txt‘): self.file = open(filename, ‘r+‘) def __del__(self): self.file.close()
__del__()在对象将要被销毁的时候被自动调用,用来将对象所占用的内存资源释放。除非有特殊要求,一般不要重写。
它并非实现了语句del x (该语句不等同于x.__del__()),而是定义了当对象被垃圾回收时的行为。 当对象需要在销毁时做一些处理的时候这个方法很有用,比如socket对象、文件对象。但是需要注意的是,当Python解释器退出但对象仍然存活的时候,__del__()并不会执行。所以养成一个手工清理的好习惯是很重要的,比如及时关闭连接或打开的文件。