python中魔法方法
1、__del__方法
销毁魔术方法
触发时机:当一个对象在内存中被清理的时候自动执行
参数:至少有一个self,接收对象
返回值:无
作用:在对象清理的时候做一些操作
注意:程序自动调用此方法,不需要我们手动调用。
class Person(object):
def __init__(self):
print('init')
def __del__(self):
print('销毁了')
person = Person()
person1 = person
print('程序结束了')
输出为:
init
程序结束了
销毁了
如上代码所示,当程序运行结束时,没有再引用的变量时,__del__会生效,所以它不是像我们预想的那样,调用这个对象时__del__就生效,所以 不会输出
2、__call__方法
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()
3、__str__方法
触发时机:打印对象会自定触发的函数,方法
参数:一个self接收对象
返回值:必须是字符串类型
作用:print(对象时)进行操作,得到字符串,通常用于快捷操作
class People:
school = 'SH'
# 1. 打印对象会自定触发的函数,方法
# 2. 返回值必须是字符串类型
def __str__(self):
return self.school
stu = People()
print(stu)
输出为:
SH
在python中 使用print()函数输出对象名称的时候默认情况下,会打印对象名引用的内存地址,如果希望打印对象的属性值,可以使用__str__(self)这个方法。
4、__new__方法
实例化魔术方法
触发时机: 在实例化对时触发
参数:至少一个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…
5、getattr、setattr、__delattr__函数
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