Разница между вызовом функции с использованием точечной нотации и использованием ее в качестве аргумента в самой функции?

#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 = Узел(«корень»), который я обычно использую. Спасибо