22 内置方法__repr__、__str__、__del__

双下划线方法

strrepr

obj.__str__(object)	#打印object信息
obj.__repr__(object) 	#会把object中的信息完整的打印出来

例如:

a = 'abcde'
print(a.__str__())
print(a.__repr__())
print(a)	#打印一个对象的时候,就是调用了a.__str__()

输出:
在这里插入图片描述

class Person:
    def __init__(self,name,sex):
        self.name = name
        self.sex = sex
    def __str__(self):
        return "Person object :%s"%self.name     #必须返回一个str类型的数据。
    def __repr__(self):
        return str(self.__dict__)
    def func(self):
        return 'heiheihei'
natuo = Person('哪托',250)
print(natuo)  # 打印一个对象的时候,就是调用a.__str__
print(repr(natuo))
print('>>> %r'%natuo)   # %r repr()  实际上都是走的__repr__
print('%s'%natuo)   # %s str()  直接打印 实际上都是走的__str__
# 当没有str的时候,会调用repr,但是,如果没有repr,则不会调用str。也就是说repr是str的备胎,但str不能做repr的备胎

print(obj)的时候,实际上是内部调用了obj.__str__方法,如果str方法有,那么他返回的必定是一个字符串,如果没有__str__方法,会先找本类中的__repr__方法,再没有再找父类中的__str__repr(),只会找__repr__,如果没有,那就找父类的。

class Classes:
    def __init__(self,name):
        self.name = name
        self.student = []
    def __len__(self):
        return len(self.student)
    def __str__(self):
        return 'classes'
py_s9= Classes('python课程')
py_s9.student.append('张三')
py_s9.student.append('李四')
print(len(py_s9))
print(py_s9)    #执行__str__方法

输出:
在这里插入图片描述

析构函数

在删除一个对象之前进行一些收尾工作

__del__()
class A:
    def __del__(self):   # 析构函数: 在删除一个对象之前进行一些收尾工作
        self.f.close()
a = A()
a.f = open()   # 打开文件 第一 在操作系统中打开了一个文件 拿到了文件操作符存在了内存中
del a          # a.f 拿到了文件操作符消失在了内存中,会先进行__del__方法,进行收尾工作。

call()

一个对象后面加’()‘,相当于执行__call__()方法

class A:
	def __init__(self,name):
		pass
	def __call__(self):
		print('我执行了')
a = A('张三')
a()

输出:
在这里插入图片描述
如果没有声明__call__()方法,程序就会报错。例如上方的代码中,将def __call()__(self)方法注销的话,就会报错。

new()

__init__ 初始化方法
__new__ 构造方法 : 创建一个对象

class A:
    def __init__(self):
        self.x = 1
        print('in init function')
    def __new__(cls, *args, **kwargs):
        print('in new function')
        return object.__new__(A, *args, **kwargs)

当代码执行的时候,会先进行__new__()方法,进行类的实例,经过__new__()之后,才会有__init__()方法中的self
单例模式,是对__new__()方法的改造。使得该类或方法,只能被实例化一次。例如:

class A:
    __instance = False
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def __new__(cls, *args, **kwargs):
        if cls.__instance:
            return cls.__instance
        cls.__instance = object.__new__(cls)
        return cls.__instance

猜你喜欢

转载自blog.csdn.net/weixin_43265998/article/details/89308851