双下划线方法
str、repr
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