面向对象深度探索day3)
类型(最终篇)
__doc__
定义类的描述信息。注意该信息无法被继承。
class A: """我是A类的描述信息""" pass print(A.__doc__)
__iter__和__next__
如果一个对象拥有了__iter__和__next__方法,那这个对象就是可迭代对相
class A: def __init__(self, start, stop=None): if not stop: start, stop = 0, start self.start = start self.stop = stop def __iter__(self): return self def __next__(self): if self.start >= self.stop: raise StopIteration n = self.start self.start += 1 return n a = A(1, 5) from collections import Iterator print(isinstance(a, Iterator)) for i in A(1, 5): print(i) for i in A(5): print(i) aaa=A(1) print(next(aaa)) print(next(aaa)) #抛异常
__enter__和__exit__
一个对象如果实现了__enter__和___exit__方法,那么这个对象就支持上下文管理协议,即with语句
class A: def __enter__(self): print('进入with语句块时执行此方法,此方法如果有返回值会赋值给as声明的变量') return 'oo' def __exit__(self, exc_type, exc_val, exc_tb): print('退出with代码块时执行此方法') print('1', exc_type) print('2', exc_val) print('3', exc_tb) with A() as f: print('进入with语句块') # with语句中代码块出现异常,则with后的代码都无法执行。 # raise AttributeError('sb') print(f) #f打印出oo print('嘿嘿嘿')
上下文管理协议适用于那些进入和退出之后自动执行一些代码的场景,比如文件、网络连接、数据库连接或使用锁的编码场景等。
__len__
拥有__len__方法的对象支持len(obj)操作。
class A: def __init__(self): self.x = 1 self.y = 2 def __len__(self): return len(self.__dict__) a = A() print(len(a))
__hash_
拥有__hash__方法的对象支持hash(obj)操作。
class A: def __init__(self): self.x = 1 self.x = 2 def __hash__(self): return hash(str(self.x) + str(self.x)) a = A() print(hash(a))
__eq__
拥有__eq__方法的对象支持相等的比较操作
class A: def __init__(self,x,y): self.x = x self.y = y def __eq__(self,obj): # 打印出比较的第二个对象的x值 print(obj.x) if self.x +self.y == obj.x+obj.y: return True else: return False a = A(1,2) b = A(2,1) print(a == b)

浙公网安备 33010602011771号