龙空技术网

Python面向对象的init方法与new方法

HelloWorld技术分享 122

前言:

而今小伙伴们对“pythonnewclass”大体比较注意,各位老铁们都想要剖析一些“pythonnewclass”的相关资讯。那么小编在网络上网罗了一些对于“pythonnewclass””的相关知识,希望兄弟们能喜欢,兄弟们一起来了解一下吧!

Python面向对象的init方法与new方法

学习新的知识时候,我总是在想,这个知识点有什么用,在哪些需求会用到,如果想不到的话,一方面会记不住这个知识点,一方面也不能深刻的理解它,要做到学以致用,灵活运用,多结合自己的业务需求,把自己新技能多多用在自己日常的编码中。

在面向对象编程时候,使用__init__()方法初始化一个类的实例,这是最普遍的做法,但是__init__()方法并不是作为实例化一个类的时候第一个调用的方法。当代码中实例化一个类的时候,先执行的是__new__()方法,当定义的类中没有重新定义__new__()方法时候,Python会默认调用该父类的__new__()方法来构造该实例,还需要注意的是,只有继承了object的类才有此方法。在用法上,__new__()方法用于创建实例,所以该方法常用在创建实例之前,它是类级别的方法,是个静态方法。而__init__()方法用户初始化实例,该方法用在实例对象创建后被调用,它是实例级别方法,用于设置类实例对象的一些初始值。如果类中同时出现了__init__()方法和__new__()方法,则先调用__new__()方法后调用__init__()方法。

__new__()方法是创建实例的第一步,执行完了需要返回创建的类的实例,否则则报错,无法执行__init__()方法。

class Animal(object):    def __new__(cls, *args, **kwargs):        print("in __new__")        print("class is", cls)        print("args are", args, **kwargs)    def __init__(self, age, value):        self.age = age        self.value = value        print("in __init__")a = Animal(10, [100, 200, 300])

执行输出

in __new__class is <class '__main__.Animal'>args are (10, [100, 200, 300])

由于重写的__init__()方法并没有把创建的实例返回,默认返回了None,因此,在调用__init__()方法时,self值是None,导致无法执行__init__()方法。

修改上例子的__init__()方法

class Animal(object):    def __new__(cls, *args, **kwargs):        print("in __new__")        print("class is", cls)        print("args are", args, **kwargs)        return object.__new__(cls)    def __init__(self, age, value):        self.age = age        self.value = value        print("in __init__")a = Animal(10, [100, 200, 300])print(a.age)print(a.value)

执行输出

in __new__class is <class '__main__.Animal'>args are (10, [100, 200, 300])in __init__10[100, 200, 300]

标签: #pythonnewclass