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__的返回值'

posted @ 2019-10-12 16:16  W文敏W  阅读(93)  评论(0编辑  收藏  举报