Python魔术方法总结

189 阅读2分钟

_call_

类的实例对象被调用时执行

class Foo:    def __call__(self, a, b, c):        # ...​x = Foo()x(1, 2, 3) # __call__

_iter_和_next_

  • Iterable: 有迭代能力的对象,一个类,实现了__iter__,那么就认为它有迭代能力,通常此函数必须返回一个实现了__next__的对象,如果自己实现了,你可以返回self,当然这个返回值不是必须的;

  • Iterator: 迭代器(当然也是Iterable),同时实现了__iter____next__的对象,缺少任何一个都不算是Iterator,迭代器迭代到最后,抛出StopIteration

  • Iterable生成Iterator

    a = iter(my_list)next(a)
    

_new_和_init__

  • new方法用于创建对象并返回对象,它作用在构造方法建造实例之前。当返回对象时会自动调用init方法进行初始化。new方法是静态方法,而init是实例方法

  • 可以这样理解:Python 中存在于类中的构造方法 __new__()负责将类实例化,而在 __init__() 执行之前,__new__()负责制造这样的一个实例对象,以便 __init__() 去让该实例对象更加的丰富(为其添加属性等)

  • 同时:__new__() 方法还决定是否要使用该 __init__() 方法,因为 __new__() 可以调用其他类的构造方法或者直接返回别的对象来作为本类 的实例。

  • __new__()方法始终都是类的静态方法,即使没有被加上静态方法装饰器。

  • new实现单例

    class Singleton(object):    _instance = None    def __new__(cls, *args, **kwargs):        if cls._instance is None:            cls._instance = object.__new__(cls, *args, **kwargs)​        return cls._instance
    
  • 进阶学Python:Python类的()

    _getitem_、_setitem_和_delitem_

    key-value方式访问实现

    class Foo:        def __setitem__(self, key, value):        pass        def __getitem__(self, item):        pass        def __delitem__(self, key):        pass​obj = Foo()obj['k'] = 123 # 内部调用__setitem__,self=obj, key=k, value=123obj['k'] # 内部调用__getitem__,self=obj, item=kdel obj['k'] # 内部调用__delitem__,self=obj, key=k
    

    _str_

    print打印实例对象时调用

    _enter_和_exit_

    上下文管理

    class Foo:    def __init__(self, name):        self.__name = name​    def __enter__(self):        return open('a.txt', mode='a', encoding='utf8')        def __exit__(self, exec_type, exec_val, exec_tb):        self.x.close()​​with Foo('haha') as f: # f = __enter__的返回    print('haha')
    

    _add_

    对象相加操作

    class Foo:    def __add__(self, other):        return 123​o1 = Foo()o2 = Foo()val = o1 + o2 # self=o1, other=o2
    

    _getattr_和_getattribute__

    属性访问,使用.访问属性时,如果找不到对象时执行,item=haha

    class Foo:    def __getattr__(self, item):        return 123obj = Foo()obj.haha # 使用.访问属性时,如果找不到对象时执行,item=haha
    

    当访问 某个对象的属性时,会无条件的调用_

    getattribute_

    。这个方法只适用于新式类