在类里面,使用__xx__()形式的方法。这一类方法可以在类被构建的时候隐式调用,从而实现多种功能。也可以通过重载这些魔术方法,来实现自定义的功能。
分配内存对象并返回,返回的实际上是self的内存地址,如果定义了__new__但是不返回,那么其下的__init__将不会执行;但如果不定义__new__,会自动分配内存地址。
class Pig:
def __new__(cls, *arg, **kwargs):
print('distribute memory space')
obj = object.__new__(cls)
print(obj)
# return obj
def __init__(self):
print('Born a pig!')
p=Pig()

class Pig:
def __new__(cls, *arg, **kwargs):
print('distribute memory space')
obj = object.__new__(cls)
print(obj)
return obj
def __init__(self):
print('Born a pig!')
p=Pig()

初始化魔术方法
从内存中清除对象,对象会默认执行方法。具体执行的时间节点
程序执行完毕,释放内存
执行del指令时
class Pig1:
def __init__(self,value):
print("对象被初始化了:{}".format(value))
def __del__(self):
print("对象被删除了")
p=Pig1("test")
print('program finished!')

当对象以函数方式调用时,会自动调用__call__
class Flight:
def __init__(self,number):
self.number=number
print(f"{number}号航班")
#办理登机手续
def checkIn(self):
print("办理登机手续")
#安全检查
def securityCheck(self):
print("安全检查")
#登记,起飞
def boarding(self):
print("起飞,登机")
def __call__(self,*args,**kwargs):
self.checkIn()
self.securityCheck()
self.boarding()
print("__call__被调用了")
#实例化一个对象f
f=Flight("CA1426")
#以函数的方式调用f
f()
#以函数的方式调用对象会自动调用__call__
#以下输出的结果

如果注视掉f()
# f()
那么就不会调用__call__,只会调用__init__,输出为:

在打印类对象时调用。使用str强制转换数据类型,在输出结果时调用。
class Dog:
def __init__(self,name):
self.name=name
def __str__(self):
return f"这是一条叫{self.name}的狗"
d=Dog("阿毛")
print(d)
#自动调用__self__

注意:
与__str__一样,也是输出对象的字符串格式,最大的不同在于,__repr__在可变容器(list,dict)中会被默认调用,否则,如果一个类中同时定义了__str__方法和__repr__方法,那么只会调用__str__方法 ,而不会调用__repr__方法
class Dog:
def __init__(self,name):
self.name=name
def __str__(self):
return f"这是一条叫{self.name}的狗"
def __repr__(self):
print("调用repr魔术方法")
return f"dog:{self.name}"
d=Dog("阿毛")
print(d)

class Dog:
def __init__(self,name):
self.name=name
def __str__(self):
return f"这是一条叫{self.name}的狗"
def __repr__(self):
print("调用repr魔术方法")
return f"dog:{self.name}"
d=Dog("阿毛")
print(d)
x=[d]
print(x)
str和repr都调用了

初始化类对象后自动调用
初始化类对象后自动调用