str 、repr 、del 面向对象编程之类的重点双下线方法

 str 、repr 、del 面向对象编程之类的重点双下线方法

直接看代码和解释!!

        当直接调用str 和repr方法时,会发现他们输出的结构都一样,都是输出其本身,并不便于我们去观察!

        于是出现了重写str reptr的双下划线方法,使我们可以更加清晰的观察到其中的字符串型的内容!!

class Person:
    def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex
    #def __str__(self):
        #return '%s,%s'%(self.name,self.age)
    #def __repr__(self):
        #return 'Orginal(%s,%s)'%(self.name,self.sex)

p1=Person('小李',20,'man')
print(p1.__str__())
print(p1.__repr__())
print(p1)

'''
1、str & repr:
    这两个方法比较像,均可改变对象的字符串显示格式!!
问题1:什么时候会执行str方法?
答:①调用str方法的时候  ②直接printf的时候

问题2:什么时候会执行repr方法?
答:repr 或者 交互式解释器中调用时-->obj._repr()

如果_str_没有被定义,那么就会使用_repr_来代替输出
注意:这两种方法的返回值return必须是字符串,否则抛出异常

2、del 析构方法(与init作用正好相反,init初始化时,会做一些实例化工作!)
析构方法,当对象在内存中被是方法时,自动触发执行

注:此方法一般无须定义,因为python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给python解释器来执行
所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的!!
'''
class Person:
    def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex
    def __str__(self):
        return '%s,%s'%(self.name,self.age)
    def __repr__(self):
        return 'Orginal(%s,%s)'%(self.name,self.sex)

p1=Person('小李',20,'man')
print(p1.__str__())
print(p1.__repr__())
print(p1)

1、str & repr:
    这两个方法比较像,均可改变对象的字符串显示格式!!


问题1:什么时候会执行str方法?
答:①调用str方法的时候  ②直接printf的时候

问题2:什么时候会执行repr方法?
答:repr 或者 交互式解释器中调用时-->obj._repr()

如果_str_没有被定义,那么就会使用_repr_来代替输出
注意:这两种方法的返回值return必须是字符串,否则抛出异常

'''
1、str & repr:
    这两个方法比较像,均可改变对象的字符串显示格式!!
问题1:什么时候会执行str方法?
答:①调用str方法的时候  ②直接printf的时候

问题2:什么时候会执行repr方法?
答:repr 或者 交互式解释器中调用时-->obj._repr()

如果_str_没有被定义,那么就会使用_repr_来代替输出
注意:这两种方法的返回值return必须是字符串,否则抛出异常

2、del 析构方法(与init作用正好相反,init初始化时,会做一些实例化工作!)
析构方法,当对象在内存中被是方法时,自动触发执行

注:此方法一般无须定义,因为python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给python解释器来执行
所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的!!
'''
class Person:
    def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex
    def __del__(self):
        print('正在进行析构!!')
    def __str__(self):
        return '%s,%s'%(self.name,self.age)
    def __repr__(self):
        return 'Orginal(%s,%s)'%(self.name,self.sex)

p1=Person('小李',20,'man')
print(p1.__str__())
print(p1.__repr__())
print(p1)

        我故意将析构函数del放在最前面,我们会发现,无论我们是否执行析构操作,他都会自动去执行这个析构,并且在全部函数执行完毕后,才执行的析构操作!!

故我做出以下总结:

2、del 析构方法(与init作用正好相反,init初始化时,会做一些实例化工作!)
析构方法,当对象在内存中被是方法时,自动触发执行

注:此方法一般无须定义,因为python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给python解释器来执行
所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的!!

有关析构函数的八股文如下:

        析构函数(destructor) 与构造函数相反,当对象结束其生命周期,如对象所在的函数调用完毕时,系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间,delete会自动调用析构函数后释放内存)。

构造函数相反,当对象结束其生命周期,如对象所在的函数已调用完毕时,系统会自动执行析构函数。以C++语言为例:析构函数名也应与类名相同,只是在函数名前面加一个位取反符~,例如~stud( ),以区别于构造函数。它不能带任何参数,也没有返回值(包括void类型)。只能有一个析构函数,不能重载。如果用户没有编写析构函数,编译系统会自动生成一个缺省的析构函数(即使自定义了析构函数,编译器也总是会为我们合成一个析构函数,并且如果自定义了析构函数,编译器在执行时会先调用自定义的析构函数再调用合成的析构函数),它也不进行任何操作。所以许多简单的类中没有用显式的析构函数

猜你喜欢

转载自blog.csdn.net/qq_46044325/article/details/127091215