请教 python 的面向对象和递归程序设计中, self 该如何理解?

2015-04-30 08:41:48 +08:00
 billgreen1
我对 python 不是太熟,基本的面向对象和递归都还能明白,但是两个结合起来就有点弄不清了,尤其加上 函数的 self 参数后。
比如定义一个树后
https://dl.dropboxusercontent.com/u/12733047/Pasted_Image_4_30_15__08_34.png
我不明白的是:那个地方的
path.append(self.left.to_list()) 与
path.append(to_list(self.left))
有什么区别。
都是递归调用
感觉挺难理解的。
3203 次点击
所在节点    Python
6 条回复
155
2015-04-30 08:52:20 +08:00
先过一遍基本语法, 这问题和递归及OO没关系.
staticor
2015-04-30 09:14:58 +08:00
self指实例自身 self.left 不就是你初始化后的左节点么.

至于递归, 联想成计算阶乘的递归结构.
clino
2015-04-30 09:20:44 +08:00
"path.append(to_list(self.left))"
这里找不到 to_list 吧? 因为局部变量里没有 to_list,就要去全局变量里找,总之不会去你的这个class里找 to_list
tomwen
2015-04-30 09:24:13 +08:00
to_list 是 Binary_Tree的一个方法;
定义的时候只有有一个参数:self, 调用的时候不能再传入其他参数,只能通过self.to_list()或者instance.to_list()调用;

而要通过to_list(self.left)来调用的话,传入的参数就不对了;除非在Binary_Tree的外部定义这个函数,再传入相应的参数。
billgreen1
2015-04-30 10:00:15 +08:00
谢谢 @155 @staticor ,特别感谢 @clino @tomwen ,你们的回答清楚明了,我现在明白啦
yorTX9t
2015-05-03 06:23:37 +08:00
楼上的诸位,这里我问一下: python 是不支持尾递归优化的,为何这个 BinaryTree 的 insert 和 to_list 方法要这么写?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/187420

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX