day22_类的魔术方法
目录
1、魔术方法
class Foo(object):
a = 'b'
def __new__(cls, *args, **kwargs):
'''1、调用类时自动触发,用继承与object的__new__方法创建一个新的对象,空对象
2、必须将产生的新对象用return返回
3、不打印返回值'''
print('实例化对象,先创建一个空对象。。。')
obj = super().__new__(cls)
print(f'通过__new__新建的对象:{obj}')
return obj
def __init__(self,name,age):
'''1、__new__被执行并返回一个对象后,自动触发
2、不打印返回值'''
print(f'__init__的第一个参数self:{self}')
self.name = name
self.age = age
def __str__(self):
'''1、在对象被打印时,自动触发,继承于object
2、打印返回值'''
obj = object.__str__(self)
return f'__str__的返回值:{obj}'
def __repr__(self):
'''1、对象被打印时,自动触发,继承于object
2、当__str__被定义了,将返回值传给__str__中的obj,不打印__repr__的返回值
3、当__str__没有被定义,打印返回值打印
即,当__str__与__repr__同时被定义,优先打印__str__,而__str__要打印的obj为__repr__的返回值'''
obj = object.__repr__(self)
return f'__repr__的返回值:{obj}'
def __call__(self, *args, **kwargs):
'''1、对象被当作函数调用时,自动触发,继承于type
2、不打印返回值'''
print(f'对象{self}被当作函数调用了')
def __del__(self):
'''1、对象本身被删除或者对象的引用被删除时(引用计数为0),自动触发,找不到它的继承来源,应该是pyhton解释器的设定
2、不打印返回值'''
print(f'对象{self}被删除')
def __delattr__(self, item):
'''1、对象的属性被删除时,自动触发,继承于object
2、不打印返回值'''
print(f'对象{self}的属性{item}已被删除')
def __setattr__(self, key, value):
'''1、修改对象的属性值或者增加对象的属性值时,自动触发,继承于object
2、不打印返回值'''
if key in self.__dict__:
print(f'修改对象{self}的属性{key}的值为{value}')
self.__dict__[key] = value
else:
print(f'增加对象{self}的属性{key},值为{value}')
self.__dict__[key] = value
# 当__getattribute__与__getattr__同时存在,只会执行__getattrbute__,除非__getattribute__在执行过程中抛出异常AttributeError
def __getattr__(self, item):
'''1、对象调用属性时,若不存在这个属性,自动触发,找不到它的继承来源,应该是pyhton解释器的设定
2、打印返回值'''
print(f'对象{self}没有属性{item}')
return f'__getattr__的返回值'
def __getattribute__(self, item):
'''1、对象调用属性,无论属性是否存在,都会触发,继承于object
2、打印返回值'''
print(item)
print(f'对象{self}在调用属性{item},不确定{item}是否存在')
return f'__getattribute__的返回值'