您可以使用操作符重載輕鬆地創建自己的樹。例如,這裏是__add__
一個基本的類實現:
class Node(object):
def __init__(self, value):
self.value = value
self.child = []
def add_child(self, child):
self.child.append(child)
def __add__(self, element):
if type(element) != Node:
raise NotImplementedError("Addition is possible only between 2 nodes")
self.value += element.value # i didn't get if you have to add also childs
return self # return the NODE object
因此,要回答你的第二個問題,這裏有一個蟒蛇把戲。在__add__
您返回self
。然後,該返回True
:
a = Node(1)
b = Node(2)
print a is a + b
如果使用a + b
,這將修改值a
。實際上,指針是a
和b
。然後,如果您將它作爲函數中的參數傳遞,並且您在函數中修改它們,則將修改a
和b
實例。有兩種不同的方式來避免這種(也許更多,但是這是兩個我使用):
第一種是直接修改的__add__
定義:
def __add__(self, element):
# .../...
value = self.value + element.value
return Node(value) # you may add rows in order to copy childs
第二個是增加一個copy
方法:
def copy(self):
# .../...
n = Node(self.value)
n.child = self.child[:] # Copy the list, in order to have 2 different instance of this list.
return n
這將允許你做這樣的事情c = a.copy() + b
和斷言c is a
將是錯誤的。
希望我回答你的問題。