首页 > 代码库 > python运算符重载2
python运算符重载2
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | 1 、重载构造函数和减法运算__init__,__sub__ #file number.py class Number: def __init__( self ,data): self .data = data def __sub__( self ,other): return Number( self , self .data - other) 2 、索引和分片:实现__getitem__方法的类可以实现索引和分片 class Indexer: def __getitem__( self ,index): return index * * 2 x = Indexer() print (x[ 2 ]) #输出:4 for i in range ( 5 ): print (x[i],end = ‘ ‘ ) #输出:0,1,4,9 或者 class Index: data = [ 1 , 2 , 3 , 4 , 5 ] def __getitem__( self ,index): print ( "index:" ,index) return self .data[index] __getitem__也是一种重载的迭代方式,可以用于:成员测试关系 in ,列表解析,内置函数 map , list , tuple ,以及类型构造方法都会自动调用__getitem__ 3 、迭代器对象:__iter__,__next__ 尽管__getitem__也实现了迭代方法,但是一般通常先尝试__iter__方法,然后在尝试__getitem__方法来对对象进行迭代 迭代环境是通过内置函数 iter 调用,__iter__方法来实现的。而这种方法返回一个迭代器,如果提供了,python就会重复调用这个迭代器的__next__方法,直到发生StopIteration.如果没有找到__iter__方法,python就会调用__getitem__,就会通过索引来取值,直到发生IndexError 例如: class Myiterator: def __init__( self ,wrapped): self .wrapped = wrapped self .offset = 0 def __iter__( self ): return self def __next__( self ): if self .offset > = len ( self .wrapped): raise StopIteration else : item = self .wrapped[ self .offset] self .offset + = 1 return item 要返回多个迭代对象,__iter__只需要替换 新的状态对象,而不是返回 self . 例如: class SkipIterator: def __init__( self ,wrapped): self .wrapped = wrapped self .offset = 0 def __next__( self ): if self .offset > = len ( self .wrapped): raise StopIteration else : item = self .wrapped[ self .offset] self .offset + = 1 return item class SkipObject: def __init__( self ,wrapped): self .wrapped = wrapped def __iter__( self ): return SkipIterator( self .wrapped) 4 、成员关系:__contains__,__iter__,__getitem__ 当用 in 判断成员关系时,可以如果__contains__存在就用这个,如果不存在就使用__iter__,如果__iter__也不存在,则使用__getitem__ class MyContains: def __init__( self ,data): self .data = data def __contains__( self ,x) return x in self .data 5 、属性引用:__getattr__,__setattr__ __getattr__拦截属性点运算,当对未定义的属性名称和实例进行点号运算时,就会用这个属性名称作为字符串调用这个方法。 class empty: def __getattr__( self ,attrname): if attrname = ‘age‘ : return 40 else : raise AttributeError,attrname x = empty() print (x.age) #输出:40 #print(x.name) 报错 在这个理由,x和empty本身都没有属性,所以对x.age会调用__getattr__方法,则 self 赋值为实例x,而attrname赋值为age。 __setattr__:如果定义了这个方法,则调用 self .attr = value会变成 self .__setattr__( ‘attr‘ ,value),要注意,在__setattr__中对任何 self 赋值时,都会调用__setattr__,导致了无穷循环,如果想用这个方法,则通过对字典属性的索引来赋值任何实例属性。也就是说 self .__dict__[ ‘attr‘ ] = value,而不是 self .attr = value 例如: class accesscontrol: def __setattr__( self ,attr,value): if attr = value: self .__dict__[attr] = value else : raise AttributeError,attr + ‘not allowed‘ |
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。