python小白入门对于一段代码的疑惑

二哥好好学习 2018-07-13 08:17:25
小弟最近在入门python,用的是经典的《python基础教程》,在看到构造函数这有一段代码没搞太明白,具体代码如下:
def check_index(key):
if not isinstance(key,int): raise TypeError
if key < 0: raise IndexError

class ArithmeticSequence:
def __init__(self,start = 0, step = 1):
self.start = start
self.step = step
self.changed = {}

def __getitem__(self, key):
check_index(key)

try:
return self.changed[key]
except KeyError:
return self.start + key*self.step

def __setitem__(self,key,value):
check_index(key)

self.changed[key] = value

在shell中运行脚本,输入了>>>s = ArithmeticSequence(1,2)

书上说这段代码可以创建一个无穷序列。疑惑主要有几点:
1.__getitem__(self,key)中的key,实例这好像并没有给他指定的值。
2.try:return self.changed[key] 是在判断值有没有修改过,不知道是怎么判断的
3.except KeyError:return self.start + key*self.step 这一句为什么KeyError是判断了值没有被修改呢?

希望大神们赐教。
...全文
197 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
七亿 2018-07-16
  • 打赏
  • 举报
回复
__setitem__:每当属性被赋值的时候都会调用该方法

__getitem__:当访问不存在的属性时会调用该方法

判断是在你自己def的check_index(key)
isinstance() 函数来判断一个对象是否是一个已知的类型

在setitem中是有个changed这个字典添加键值对的 在check_index()后 返回用字典取得值 没有就是错误的执行except下的语句

感觉说的很详细了,你需要自己去把思路捋一下
FightingBoom 2018-07-14
  • 打赏
  • 举报
回复
我也小白一个,刚刚参考书看了这个程序,把我的看法给你说一下,如果你自己已经解决的话,可以给我分享一下经验~~
首先,我认为这句 s = ArithmeticSequence(1,2) 给的是start,step的值。这样的话字典就是{1,3,5,7,9,11,13,...}(可得 s[4]=9, s[5]=11),即可验证正确性。
1. key是没有给指定值的,key是字典里边的键值。需要自己赋值来查看字典里边的内容,书上直接用s[4] = 9来查看字典里边的值。我自己用的s.__getitem__(2) 来给key赋值。如果课本上的是对的话,那就这两种都可以,只是不知道为什么 s[4] 直接就是给key赋值
2. try...except...是一个用于检测和处理异常的语句,如果 try 后边的语句有语法错误,就输出 except 后边的内容。(可以参考小甲鱼《零基础入门学习python》P95页)。这个函数,判断有没有修改过,先执行了check_index()函数,来检查是否有两种语法错误,然后再到 try 。
这样应该可以解释你的问题了,有疑问我们可以共同探讨~~~

37,718

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧