1.del 方法和对象的生命周期

介绍两个对象的内置方法,那么在Python中啊,还有另外一个跟初始化方法 __init__相对应的方法, __del__方法,当一个对象要被从内存中销毁之前, 所谓从内存中销毁,就是把这个对象从内存中咔嚓掉,当这个对象离开内存之前, 系统会自动帮我们调用一下对象的__del__方法.

python的多变量 python多变量输出_python的多变量

在实际开发中啊,可以对 __init__方法进行改造,这样呢可以让创建对象更加的灵活对吧?在开发中啊,如果希望在一个对象离开这个世界之前,还希望让它再做一些事情,这个时候呢就可以考虑到__del__方法了,先使用class这个关键字来定义一个猫类Cat. 要自定义初始化方法, 应该在self后面增加一个逗号,然后增加一个形参, new_name,方法的形参准备好了之后,我们就在方法内部定义一个name的属性,并且把new_name这个形参设置给name这个属性,

python的多变量 python多变量输出_python_02

属性定义完成,我们就使用print函数做一个输出,现在一个自定义初始化方法已经搞定了,

python的多变量 python多变量输出_分割线_03

使用类名来创建对象,同时在创建对象时要指定一下new_name这个参数对应的实参, tom = Cat("Tom"), 

class Cat:
    def __init__(self, new_name):
        self.name = new_name
        print("%s 来了" % self.name)

tom = Cat("Tom")

运行一下程序, 运行结果:

python的多变量 python多变量输出_python_04

调用完初始化方法之后,这样对象就已经存活在世界上了,在后续我们就可以通过tom 这个变量名访问到对象内部的属性. 下面代码访问tom 的name 属性.

class Cat:
    def __init__(self, new_name):
        self.name = new_name
        print("%s 来了" % self.name)

tom = Cat("Tom")
print(tom.name)

运行结果: 输出了Tom

python的多变量 python多变量输出_分割线_05

没有主动调用__del__方法, 但程序执行完成前会自动调用

class Cat:
    def __init__(self, new_name):
        self.name = new_name
        print("%s 来了" % self.name)

    def __del__(self):
        print("%s 去了" % self.name)

tom = Cat("Tom")
print(tom.name)
# 程序执行完成前,调用了__del__方法, 输出了 "Tom 去了"

运行结果:

python的多变量 python多变量输出_python的多变量_06

因为这个方法是在对象被从内存中销毁之前由系统自动调用的,现在在代码的下方使用print函数做一个分割线,"Tom去了" 应该在分割线下方输出,因为tom 这个变量在当前这个模块中是一个全局变量,当我们所有的代码执行完成之后,系统才会把汤姆这个对象进行回收.

class Cat:
    def __init__(self, new_name):
        self.name = new_name
        print("%s 来了" % self.name)

    def __del__(self):
        print("%s 去了" % self.name)

tom = Cat("Tom")
print(tom.name)
# 程序执行完成前,调用了__del__方法, 输出了 "Tom 去了"
print("-" * 50)

运行结果:

python的多变量 python多变量输出_全局变量_07

Python中有个特殊的关键字del, 能够删除某一个对象,del关键字就可以删除一个对象,现在使用del 关键字把tom 这个对象做个删除, del关键字的代码是在分割线的上方,再来运行一下程序,对比一下效果,这次"Tom去了"就在分割线上方输出了, 所以我们用del 关键字把tom 这个对象删除之后,系统会首先自动把我们调用__del__ 方法,当__del__ 方法执行完成之后,才会来执行第20行的打印分割线这行代码.

class Cat:
    def __init__(self, new_name):
        self.name = new_name
        print("%s 来了" % self.name)

    def __del__(self):
        print("%s 去了" % self.name)

tom = Cat("Tom")
print(tom.name)
# 程序执行完成前,调用了__del__方法, 输出了 "Tom 去了"


# del 关键字可以删除一个对象
del tom
print("-" * 50)

执行结果:

当__del__ 方法执行完成之后,才会来执行第20行的打印分割线这行代码.

python的多变量 python多变量输出_分割线_08

2. str方法定制变量输出信息

python的多变量 python多变量输出_字符串_09

 

另外一个内置方法__str__,在Python中,我们如果使用print这个函数输出一个对象变量时,默认情况下会输出, 这个变量引用的对象是由哪一个类创建的对象,并且把这个对象的内存地址输出来,如果在开发中,我们使用print函数在输出这个变量时,不希望看到这些内容,而希望看到一些自己定义的内容, 应该使用到__str__这个内置方法了,但是在使用__str__这个内置方法时,必须要返回一个字符串.

我们直接在控制台把tom 这个变量做个输出,如果现在运行程序会输出猫类Cat()以及猫对象tom 在内存的地址.

下面代码直接打印tom 变量

class Cat:
    def __init__(self, new_name):
        self.name = new_name

        print("%s 来了" % self.name)

    def __del__(self):
        print("%s 去了" % self.name)

#tom 是一个全局变量
tom = Cat("Tom")
print(tom)

输出结果(第三行): 输出Cat()类, 并且把对象tom 的地址输出出来

python的多变量 python多变量输出_python_10

这个就是默认情况下使用print函数看到的效果.

现在使用__str__方法, 并且返回一个字符串

class Cat:
    def __init__(self, new_name):
        self.name = new_name

        print("%s 来了" % self.name)

    def __del__(self):
        print("%s 去了" % self.name)

    def __str__(self):
        #必须返回一个字符串
        return "我是小猫"

#tom 是一个全局变量
tom = Cat("Tom")
print(tom)

输出结果:

python的多变量 python多变量输出_分割线_11


增加了一个__str__方法后,看一下效果,"Tom来了"之后输出的是"我是小猫",而不是输出之前默认的创建这个对象的类, 以及对象在内存中的地址. 通过这个演练可以发现,如果我们在开发中啊,希望使用print函数打印某一个对象的变量时,希望在控制台看到一些我们自定义的信息,就可以利用__str__这个内置方法,同时要注意这个方法是必须要返回一个字符串的, 那现在既然是返回一个字符串,我们可以对"我是小猫"进行一个改造.

class Cat:
    def __init__(self, new_name):
        self.name = new_name

        print("%s 来了" % self.name)

    def __del__(self):
        print("%s 去了" % self.name)

    def __str__(self):
        #必须返回一个字符串
        return "我是小猫[%s]" % self.name

#tom 是一个全局变量
tom = Cat("Tom")
print(tom)

运行结果:

python的多变量 python多变量输出_python的多变量_12

输出"我是小猫Tom",现在我们对使用方法改造之后,再使用print函数打印猫对象tom的时候,就可以直接看到猫对象tom的内部属性是什么值,而不需要再在外部通过tom.name这种方式来查看一下这个对象中name属性保存的是什么值.