python 常见的特殊方法

特殊方法

特殊方法,也称为魔术方法

特殊方法都是使用__开头和结尾的

class Foo(object):
    def __call__(self, *args, **kwargs):
        '''构造方法的执行是由创建对象触发的,对象加括号执行'''
        print('__call__方法执行了')
        return args, kwargs

    def __init__(self):
        '''构造方法,创建实例时候会自动执行,面向对象中非常常用,一般用来封装各种参数'''
        print('__init__执行了')
        self.data_dict = {'name': 'yanghao', 'age': 23}

    def __repr__(self):
        '''如果一个类中定义了__repr__方法,那么在repr(对象) 时,默认输出该方法的返回值。'''
        return '__repr__ 执行了'

    def __getitem__(self, key):
        '''获取值'''
        return print(self.data_dict[key])

    def __setitem__(self, key, value):
        '''设置值'''
        self.data_dict[key] = value
        return print(self.data_dict)

    def __delitem__(self, key):
        '''删除值'''
        self.data_dict.pop(key)
        return print(self.data_dict)

    def __getattr__(self, item):
        '''访问不存在的属性会调用'''
        print('__getattr__执行了')

    def __setattr__(self, key, value):
        '''设置属性'''
        print('__setattr__执行了')
        self.__dict__.setdefault(key, value)
        print(self.data_dict)

    def __delattr__(self, item):
        '''del obj.key'''
        print('执行 __delattr__')
        print(self.__dict__)
        self.__dict__.pop(item)

    def __len__(self):
        '''len'''
        return len(self.data_dict)

    def __str__(self):
        '''如果类中有str方法的话直接打印实例,会输出str方法中定义的返回内容'''
        return '__str__执行了'

    def __del__(self):
        '''析构方法,当对象在内存中被释放时,自动触发执行。'''
        print('__del__释放')


class Aoo(object):

    def __init__(self):
        self.x = 1

        print('in init function')

    def __new__(cls, *args, **kwargs):
        '''new方法和init方法的区别就是,new方法是正在创建实例时候执行,而init方法是创建实例后才执行。'''
        print('in new function')

        return object.__new__(Aoo, *args, **kwargs)


if __name__ == '__main__':
    obj = Foo()
    # ------------------------------
    obj()  # __call__
    print(repr(obj))
    a = obj['name']
    obj['phone'] = 18577609987
    del obj['age']
    # -------------------------------
    print('-' * 80)
    # ------------操作对象属性-------------------
    getattr(obj, 'dsadasda')  # 不存在的属性时会调用该方法,你可返回任何值,当找不到时便返回。
    setattr(obj, 'a1', '123')
    del obj.data_dict
    # -------------------------------
    print('-' * 80)
    # -------------------------------
    print(len(obj()))
    print(obj)
    # -------------------------------
    a_obj = Aoo()

    print(a_obj.x)

除了上面部分还有下面这些特殊方法也都是比较实用的

    # __add__(self, other)
    # __sub__(self, other)
    # __mul__(self, other)
    # __matmul__(self, other)
    # __truediv__(self, other)
    # __floordiv__(self, other)
    # __mod__(self, other)
    # __divmod__(self, other)
    # __pow__(self, other[, modulo])
    # __lshift__(self, other)
    # __rshift__(self, other)
    # __and__(self, other)
    # __xor__(self, other)
    # __or__(self, other)

    # __lt__(self, other) 小于 <
    # __le__(self, other) 小于等于 <=
    # __eq__(self, other) 等于 ==
    # __ne__(self, other) 不等于 !=
    # __gt__(self, other) 大于 >
    # __ge__(self, other) 大于等于 >= 
原文地址:https://www.cnblogs.com/HByang/p/13534573.html