likes
comments
collection
share

python|面向对象-3|类的生命周期

作者站长头像
站长
· 阅读数 18

在前2篇文章中,我们介绍了什么是面向对象,以及面向对象和面向过程的对比,而后便是一些python对类的一些操作。第二篇文章,我们主要讲述了继承和多态。 本篇文章,我们将继续介绍python的面向对象,我们将介绍类中的内置函数。

本篇文章所依赖的环境为:

python|面向对象-3|类的生命周期

类中的内置方法有哪些

python中,除了我们第一篇讲述的构造函数__init__和析构函数__del__,其实class中还有其他的内置方法,如__str__,它则表示在使用print函数打印类实例对象的时候,会调用__str__。除此之外,还有__len____repr____getitem____setitem____getattr__、以及__call__等。

这些都属于python的特殊方法,将用于对类或者对象进行特殊的初始化、操作 以及 销毁时,会进行的处理。

类为什么需要这些内置函数

因为需要有这些特性,比如,需要在创建类的时候,初始化一些设置,在删除类的对象的时候,执行一些销毁函数,如果开发者可以接入其中,为业务增添一些功能,可以给类和对象提供非常多的特性。让程序更加健壮。

通过内置函数,来说明一下类的声明周期

我们将通过重写一些内置方法,来说明类的声明周期,代码如下:

python|面向对象-3|类的生命周期

如上代码,我们定义了一个类aaa,其中我们并未自己定义方法,而是重写了__init____del____call__``__new__方法,其中__new__方法,我们返回了父类的__new__方法。

代码执行后,我们可以看到执行结果如下:

python|面向对象-3|类的生命周期

通过上述结果,我们可以看到,当我们在实例化类对象的时候,即:a = aaa(),我们会先调用__new__方法,该方法的作用是为对象分配内存,并且调用__new__方法,该方法会返回一个对象实例。 而后再调用__init__方法,该方法会进行初始化、设置属性的初始值等等。

当我们在执行对象的时候,即:a(),我们会调用__call__方法,当我们执行del a的时候,python会调用__del__方法来清理对象占用的内存空间。如果我们不写del a,当程序执行结束前,也会执行__del__方法。

但是你有没有发现一些问题呢? 我们除了定义__new____init____call____del__方法之外,我们还定义了__str____len__方法,为什么他们没有执行呢?

这是因为我们并未在对象使用过程中来调用,继而不会引发__str____len__方法被调用。我们可以修改一下程序,调用一下a对象,从而实现 __str____len__的调用。

python|面向对象-3|类的生命周期

我们在上述的程序的基础上,增加了__str__方法和__len__方法,并且为__init__方法增加了一个参数list并且赋值给self.lists,在__len__方法中,我们返回了self.lists的长度,在__str__方法中,我们直接返回了父类的__str__(方法。

最后在主函数中,我们调用了print(a)len(a)

程序执行结果如下:

python|面向对象-3|类的生命周期

可以发现,__str____len__方法都被执行了。所以说,有些内置变量并不是创建实例对象就会执行的,而是需要调用该方法,才会执行。

总结

本篇文章,我们承上启下,继续介绍了python的内置函数,以及使用案例来说明,创建一个类,会经历哪些生命周期。但是有些内置函数,并不是创建了类就会执行的,而是需要在调用其方法的时候,才会被执行,例如: 对类实例调用print方法,会调用类中内置方法__str__、对类实例调用len方法,会调用内置方法__len__