试图理解为什么这个Python代码工作

时间:2014-10-21 09:29:00

标签: python oop

这是维基百科上提供的Ford-Fulkerson algorithm的实现。我理解算法很好,我的问题是:add_edgemax_flow方法访问redge的{​​{1}}(反向边缘)为edge,但是edge.redge类没有名为Edge的属性。尽管如此,代码运行良好。

redge

3 个答案:

答案 0 :(得分:2)

代码设置 redge属性:

edge = Edge(u,v,w)
redge = Edge(v,u,0)
edge.redge = redge
redge.redge = edge

从那里开始,edgeredge个对象都有redge个属性。

换句话说,在Python中,您可以自由地向代码中的任何位置添加属性,您不仅限于类定义或类本身的方法。 self只是对实例的另一个引用,与edgeredge引用的方式相同。

答案 1 :(得分:2)

您可以使用以下命令为现有的用户定义对象分配新属性:

obj.prop = value

一旦分配,它们就存在。

你可以看到__init__方法做同样的事情:它只是分配属性,然后它们就存在了。

答案 2 :(得分:2)

Python类不声明对象属性,它们存储在每个实例的字典中。 Edge对象恰好以三个属性sourcesinkcapacity开头。稍后它会获得一个新属性redge。这是许多脚本语言的标准,包括Python。

话虽如此,请注意稍后添加属性的做法被一些人认为是混淆的。为了清楚起见,最好初始化类打算在构造函数中使用的所有属性。