免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2073 | 回复: 8
打印 上一主题 下一主题

新手请教下面这段代码 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-01-03 08:54 |只看该作者 |倒序浏览
class X:
    def __getitem__(self, n):
        return (n+2)*3

x = X()
i = iter(x)
y = 0

for n in i:
    print "y is", y, ",",
    if n > 20:
        break
    else:
        print "n is", n
    y += 1

y is 0 , n is 6
y is 1 , n is 9
y is 2 , n is 12
y is 3 , n is 15
y is 4 , n is 18
y is 5 ,


x是X的一个实例,i是x的一个iterator,这两个都声明完了,下面又声明了一个y,我就不明白y的值变化是如何影响到n的值变化的?我已经看过__getitem__()的解释,不过还是不明白这几个变量是怎么被联系在一起的。请高手指点,谢谢。

论坛徽章:
0
2 [报告]
发表于 2010-01-03 11:08 |只看该作者
这么跟楼主说吧,不要在这个问题上纠缠了。这种写法从Py语法上看,没有道理。

__getitem__ 实现的是对象的 . 运算符。但是你是不可能写 x.1, x.3的。

而这iter(x),调用的又是X类的 __iter__方法。而这个__iter__又没有定义。

真的没有定义吗?又不是,因为这个__getitem__属于 catch all。他接管了这个iter。然后就是Py的魔术了。究竟详情如何,我也不知道了。反正里面一团浆糊。

论坛徽章:
0
3 [报告]
发表于 2010-01-03 11:22 |只看该作者

回复 #2 shhgs 的帖子

谢谢shhgs,您真是光明使者:wink:

是看了您的解释,对这个iter(X)的理解又深了一层,不过还是没完全理解。

俺决定听您的建议,不在这个问题上纠缠了。谢谢。

论坛徽章:
0
4 [报告]
发表于 2010-01-03 16:56 |只看该作者

回复 #1 向死而生 的帖子

y的值和n的值没有关系,你可以把和y有关的语句全部删除,仍然可以正常运行。

iter会尝试调用 __iter__ 或者 支持下标为0的__getitem__ 方法,这个例子中,X类的__getitem__方法支持下标为0,因此iter(x),就从下标为0开始运行:
相当于连续执行x[0], x[1], x[2], ....

论坛徽章:
0
5 [报告]
发表于 2010-01-03 17:19 |只看该作者
原帖由 HyryStudio 于 2010-1-3 16:56 发表
y的值和n的值没有关系


y和n有关系啊,程序执行的结果可以看出来n=(y+2)*3
y is 0 , n is 6
y is 1 , n is 9
y is 2 , n is 12
y is 3 , n is 15
y is 4 , n is 18

你可以把和y有关的语句全部删除,仍然可以正常运行。

我知道把y有关的语句删除,仍然可以正常运行。但是这时n的值就固定不变了。

我当初发文就是想知道这个y是怎么传给__getitem__来改变n的值的

谢谢指教。

论坛徽章:
0
6 [报告]
发表于 2010-01-03 17:31 |只看该作者

回复 #5 向死而生 的帖子

运行一下下面的代码试试看就知道了,n和y没有关系,n之所以变化是因为for循环和iter函数的作用

class X:
    def __getitem__(self, n):
        return (n+2)*3

for n in iter(X()):
    print n
    if n > 20: break

论坛徽章:
0
7 [报告]
发表于 2010-01-03 18:58 |只看该作者
原帖由 HyryStudio 于 2010-1-3 17:31 发表
运行一下下面的代码试试看就知道了,n和y没有关系,n之所以变化是因为for循环和iter函数的作用

class X:
    def __getitem__(self, n):
        return (n+2)*3

for n in iter(X()):
    print n
   ...


嗯,明白了,谢谢:wink: 送花

论坛徽章:
0
8 [报告]
发表于 2010-01-05 07:47 |只看该作者
不好意思。看错了。getitem实现的是[]运算符。

不过说实话,我还是不懂这种写法背后的语法根据。估计是Py解释器里的魔术吧。

论坛徽章:
0
9 [报告]
发表于 2010-01-05 10:07 |只看该作者
原帖由 shhgs 于 2010-1-5 07:47 发表
不好意思。看错了。getitem实现的是[]运算符。

不过说实话,我还是不懂这种写法背后的语法根据。估计是Py解释器里的魔术吧。

__这样的貌似PHP里也是魔术函数,大家都喜欢这么干把
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP