注册 登录

清河洛

python中类的构造和构析魔法方法

qingheluo2018-11-23清河洛270
__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赋值为当前类Foo1、如果类中没有重写__new__()方法,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__()并不会执行。所以养成一个手工清理的好习惯是很重要的,比如及时关闭连接或打开的文件。

        


网址导航