初学者,总结了一下运算符重载的学习,分享出来;有不对的,朋友看了可以指出来,谢谢!
#运算符重载学习案例
#根据《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到更大的索引值,
#个人理解这个就是内置的一些东西吧。(具体的仍旧不懂)
#另外一句“如果定义了该方法,for循环每次都会通过连续的更高的偏移量来调用累的getitem方法。”
#此外,除了for循环外,能进行迭代的一些运算,如列表推导、map等,getitem也支持。
#看到这,我觉得运算符重载的逻辑,应该大致清晰了。 是不是有点啰嗦,好吧!
Sign in to make a reply
用户7041329703
初学者,总结了一下运算符重载的学习,分享出来;有不对的,朋友看了可以指出来,谢谢!
#运算符重载学习案例
#根据《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也支持。
#看到这,我觉得运算符重载的逻辑,应该大致清晰了。 是不是有点啰嗦,好吧!