_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
-
_getitem_、_setitem_和_delitem_
key-value方式访问实现
class Foo: def __setitem__(self, key, value): pass def __getitem__(self, item): pass def __delitem__(self, key): passobj = 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 123o1 = 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_
。这个方法只适用于新式类