Как объявить функцию в классе, а не вне класса в python

Я новичок в Python и алгоритмах, и я хочу объявить функцию внутри класса, а не за его пределами. Вот что у меня есть сейчас:

Общая реализация класса дерева NAryTree:

class NAryTree:
    def __init__(self, key):
        self.key = key
        self.children = []
    def __str__(self):
        return str(self.key)
    def addChild(self, tree):
        self.children.append(tree)
    def getChild(self, k):
        return self.children[k]
    def getNChildren(self):
        return len(self.children)
    def __iter__(self):
        return self.children.__iter__()
    def __next__(self):
        return self.children.__next__()

Функция minSubtree(tree) для вычисления минимальной суммы поддерева:

def minSubtree(tree):
    value = tree.key
    for child in tree:
        value += min(minSubtree(child), 0)
    return value

И функция Build Tree buildMyNAryTree():

def buildMyNAryTree():
    root = NAryTree(1)

    root.addChild(NAryTree(-2))
    root.addChild(NAryTree(3))
    root.addChild(NAryTree(4))

    root.getChild(0).addChild(NAryTree(-5))
    root.getChild(1).addChild(NAryTree(6))
    root.getChild(1).addChild(NAryTree(7))
    root.getChild(2).addChild(NAryTree(-8))

    root.getChild(0).getChild(0).addChild(NAryTree(-9))
    root.getChild(0).getChild(0).addChild(NAryTree(-10))
    root.getChild(0).getChild(0).addChild(NAryTree(11))
    root.getChild(1).getChild(0).addChild(NAryTree(-4))
    root.getChild(1).getChild(1).addChild(NAryTree(12))
    root.getChild(1).getChild(1).addChild(NAryTree(-13))
    root.getChild(2).getChild(0).addChild(NAryTree(14))
    return root

Я хочу объявить minSubtree(tree) внутри класса, но я не знаю, как изменить параметр. Другими словами, я хочу вернуть минимальную сумму поддерева, используя buildMyNAyTree().minSubtree() вместо minSubtree(buildMyNAryTree()).

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
58
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я думаю, это должно делать то, что вы хотите:

Он выполняет итерацию по дочерним элементам дерева и вызывает команду minSubTree дочернего элемента.

class NAryTree:
    def __init__(self, key):
        self.key = key
        self.children = []
    def __str__(self):
        return str(self.key)
    def addChild(self, tree):
        self.children.append(tree)
    def getChild(self, k):
        return self.children[k]
    def getNChildren(self):
        return len(self.children)
    def __iter__(self):
        return self.children.__iter__()
    def __next__(self):
        return self.children.__next__()

    def minSubtree(self):
        value = self.key
        for child in self.children:
            value += min(child.minSubtree(), 0)
        return value

Вы можете использовать for child in self, потому что экземпляры NAryTree уже являются итеративными.

timgeb 16.10.2018 11:26
Ответ принят как подходящий

Сделайте отступ для функции внутри тела класса и по соглашению переименуйте tree в self. Доступ к child.minSubtree() вместо minSubtree(child).

class NAryTree:
    # your other methods
    def minSubtree(self):
        value = self.key
        for child in self:
            value += min(child.minSubtree(), 0)
        return value

print(buildMyNAryTree().minSubtree()) производит -32.

Другие вопросы по теме