销毁魔术方法
触发时机:当一个对象在内存中被清理的时候自动执行
参数:至少有一个self,接收对象
返回值:无
作用:在对象清理的时候做一些操作
注意:程序自动调用此方法,不需要我们手动调用。
class Person(object): def __init__(self): print('init') def __del__(self): print('销毁了') person = Person() person1 = person print('程序结束了')
init 程序结束了 销毁了
如上代码所示,当程序运行结束时,没有再引用的变量时,__del__会生效,所以它不是像我们预想的那样,调用这个对象时__del__就生效,所以 不会输出
call():当给对象加括号时候,自定触发的函数
进一步模糊了函数和对象之间的概念。
使用方式:对象后面加括号,触发执行。即:对象() 或者 类()()
class Foo: def __init__(self): pass # 当给对象加括号时候,自定触发的函数 def __call__(self, *args, **kwargs): print('__call__') obj = Foo() # 执行 __init__,将Foo内存地址赋值给了obj obj() # 内存地址加括号就是调用
__call__
如上代码所示,调用__call__时,并不需要Foo.call。因为在obj=Foo()时,就已经将Foo()的内存地址赋值给了obj,所以后面调用时obj本身就代表了那个内存地址,当成函数使用obj()
触发时机:打印对象会自定触发的函数,方法
参数:一个self接收对象
返回值:必须是字符串类型
作用:print(对象时)进行操作,得到字符串,通常用于快捷操作
class People: school = 'SH' # 1. 打印对象会自定触发的函数,方法 # 2. 返回值必须是字符串类型 def __str__(self): return self.school stu = People() print(stu)
输出为:
SH
在python中 使用print()函数输出对象名称的时候默认情况下,会打印对象名引用的内存地址,如果希望打印对象的属性值,可以使用__str__(self)这个方法。
实例化魔术方法
触发时机: 在实例化对时触发
参数:至少一个cls接收当前类
返回值:必须返回一个对象实例
作用:实例化对象
注意:实例化对象是Object类底层实现,其他类继承了Object的__new__才能够实现实例化对象。
没事别碰这个魔术方法,先触发__new__才会触发__init__
class Person(object): # 初始化 def __init__(self): print('init...') # 实例化方法(构造方法)---》创建对象 def __new__(cls, *args, **kwargs): print('new...') ret = super().__new__(cls) # 调用父类的__new__()方法创建对象,并用接收返回值 return ret # 将对象返回给person
输出为:
new... init... <__main__.Person object at 0x0000012173217B80>
如上代码所示,要先创建一个对象,才能初始化,所以输出是先输出new…,才输出init…
getattr:对象.属性,当属性不存在,会自动触发__getattr__方法
setattr:给不存在属性赋值的时候执行,会自动触发__setattr__方法
delattr:当删除属性的时候还行,**会自动触发__delattr__方法
class Foo: x = 1 def __init__(self, y): self.y = y # 当访问一个不存在的属性时候,会自定触发 def __getattr__(self, item): print('----> from getattr:你找的属性不存在') def __setattr__(self, key, value): print('----> from setattr') # print(key) # print(value) # self.key = value # 这就无限递归了,你好好想想 self.__dict__[key] = value # 应该使用它 def __delattr__(self, item): print('----> from delattr') # del self.item #无限递归了 self.__dict__.pop(item) obj = Foo(10) obj.z = 10 print(obj.a) # 不存在的属性
输出为:
----> from setattr ----> from setattr ----> from getattr:你找的属性不存在 None