#python #methods
Вопрос:
У меня есть код, который выполняет базовый поиск по глубине:
class Node:
def __init__(self, name):
self.children = []
self.name = name
def addChild(self, name):
self.children.append(Node(name)) #recall I came across this before- 'Node(name)' is a node
return self
def depthFirstSearch(self, array): #self in this case is the root
array.append(self.name)
for child in self.children:
child.depthFirstSearch(array)
return array
Мой вопрос примерно во второй последней строке child.depthFirstSearch(array)
, вместо этого, мы можем это сделать depthFirstSearch(child,array)
? Будут ли они эквивалентны, потому что последнее-это то, как я обычно вызываю функцию, вместо того, чтобы использовать точечную нотацию.
Я вижу одну причину, по которой это на самом деле не имело бы смысла , потому что для третьей последней строки у нас была бы child.children
, которой не существует?
Наконец, когда мы вообще используем точечную нотацию? Или в этом нет необходимости, если мы не хотим его использовать.
Комментарии:
1. Я верю , что вы могли бы написать:
Node.depthFirstSearch(child,array)
, но вам следует придерживаться того, что у вас есть.2. Спасибо, куамрана, но мой вопрос в том, могу ли я полностью избежать точечной нотации?
3. Или это необходимо для DFS
4. Можете ли вы обновить свой вопрос примером того, как
depthFirstSearch()
вызываетсяroot
узел?5.
dot
Обозначение-это способ доступа к атрибутам, связанным с объектом.
Ответ №1:
Простой ответ: да, вы можете удалить точечную нотацию вокруг depthFirstSearch()
, но это будет считаться немного хуже , чем то, что у вас есть сейчас:
class Node:
def __init__(self, name):
self.children = []
self.name = name
def addChild(self, name):
self.children.append(Node(name)) #recall I came across this before- 'Node(name)' is a node
return self
def depthFirstSearch(self, array): #self in this case is the root
array.append(self.name)
for child in self.children:
child.depthFirstSearch(array)
return array
# Free function version of depthFirstSearch()
def depthFirstSearch(node, array):
array.append(node.name)
for child in node.children:
depthFirstSearch(child, array)
return array
root = Node('root') # My guess at how you generate a root
... # Add more children to root and more children to those Nodes
array = root.depthFirstSearch([]) #My guess at how you call this now
array = depthFirstSearch(root, []) #You can call the free function like this
Причина, по которой ваш исходный код предпочтительнее, заключается в том, что бесплатная функция получает доступ к атрибутам, о которых ей не нужно знать. Там есть имя узла: node.name
и дочерние элементы узла: node.children
Комментарии:
1. Ах да, теперь я собрал все воедино! Спасибо Quamrana — это root = Узел(«корень»), который я обычно использую. Спасибо