Discuss / Python / 运算符重载学习

运算符重载学习

Topic source

初学者,总结了一下运算符重载的学习,分享出来;有不对的,朋友看了可以指出来,谢谢!

#运算符重载学习案例

#根据《Python学习手册》P870;“这些特殊方法是帮你帮你绑定内置操作的钩子”

“在类中,能对内置对象进行的所有操作,几乎都有相应的特殊名称的重载方法;”

#对上面两句的理解:在定义某一个类、创建实例后;实例在(类的)外部希望对内置对象进行相关操作(运算),

在类中都可以通过特殊名称(这个带双下划线的名称,就是联系钩子)的方式与该操作建立联系,从而实现拦截;

并将相关运算操作放在定义或继承的方法下完成。(不知道这样讲,讲明白了没,要不就得自己看书)

#案例(来自学习手册):

#getitem 索引、分片、迭代 class Indexer(): #定义一个类 def getitem(self,index): #定义一个特殊运算符(重载) return index**2

    #返回一个结果,和前边学习的索引不一样;反正就是建立联系之后,重载运算,输出结果;

X = Indexer() print(X[2])

#解释:当实例X,出现在X[i]这样的索引运算中时;

#Python会自动调用实例继承的getitem方法,

#把X作为self传入,把2作为第二位参数传入;最终通过下边运算返回一个结果;

#以上就是运算符重载,所谓重载的逻辑;

#下边是,通过for循环调用该类的方法; for i in range(10): print(X[i],end=' ')

#打印:0 1 4 9 16 25 36 49 64 81

#上边这个类,做不了切片,除非再传入一个列表属性

#下边是:getiiem的索引迭代案例

#利用for循环进行 class StepperIndex: def getitem(self,i):#强调;getitem运算符会拦截索引、切片、迭代 return self.data[i] X = StepperIndex() X.data = 'Spam' print(X[0]) #索引“X[i]”拦截getitem;打印结果为 S

for item in X: #for循环 拦截getitem(for loops call getitem) print(item,end=' ') #打印结果为:S p a m

#注:这里for循环的是X,第一次看的时候不明白为什么是X;

#X也不是列表啊,循环的数字在哪?

#书中P877;有一句话:“利用for语句通过使用从0到更大的索引值,

重复对序列进行索引运算,直到检测到超出边界的IndexError异常。”

#个人理解这个就是内置的一些东西吧。(具体的仍旧不懂)

#另外一句“如果定义了该方法,for循环每次都会通过连续的更高的偏移量来调用累的getitem方法。”

#此外,除了for循环外,能进行迭代的一些运算,如列表推导、map等,getitem也支持。

#看到这,我觉得运算符重载的逻辑,应该大致清晰了。 是不是有点啰嗦,好吧!


  • 1

Reply