Python классы / функции и собственный параметр - PullRequest
0 голосов
/ 18 ноября 2018

У меня есть простой код, чтобы найти индексы 2 элементов, которые складываются в сумму. (предположим, что сумма существует в списке)

class Solution(object):
    def twoSum(self, nums, target):
        compliment = []
        for ind, item in enumerate(nums):
            print(ind)
            if item in compliment:
                return [nums.index(target - item), ind]
            compliment.append(target - item)
        return [0, 0]

if __name__ == "__main__":

    result = Solution()
    final = result.twoSum([3, 3], 6)

    #Why does this not work without removing the self parameter??
    #final = Solution.twoSum([3, 3], 6)

    print(str(final))

Я пытаюсь узнать, как лучше всего создать экземпляр объекта в Python. В моей основной функции я решил упростить это, сделав это в 1 строке вместо 2. Вы можете видеть мои 2 попытки вызова функции в этом классе. 2-й сбой, если я не удаляю параметр self из параметров функции. Это потому, что я пытаюсь передать 2 вместо 3 аргументов.

В любом случае, я запутался, почему мои две реализации отличаются и почему одна работает, а другая нет. Я также не уверен, что мне вообще нужно здесь. Кажется, что self в основном используется, когда у вас есть __init__ и вы определяете переменные для класса? Поскольку я здесь этим не занимаюсь, нужно ли вообще это вообще?

Ответы [ 2 ]

0 голосов
/ 18 ноября 2018

Вы можете выбрать декорирование вашей функции как статического метода или метода класса в Python. В случае метода класса вам нужно иметь cls в сигнатуре метода. Вот хорошая дискуссия, чтобы различить два:

В чем разница между @staticmethod и @classmethod?

Кстати - для вашего кода я бы весьма предложил бы использовать набор вместо массива. Это сделает ваш код намного более эффективным. Проверка, было ли целевое значение уже замечено в наборе, является в среднем операцией с постоянным временем.

0 голосов
/ 18 ноября 2018

Параметр self требуется (и будет работать только) для методов экземпляра. Методы экземпляра также являются типом по умолчанию. Чтобы использовать его без экземпляра и без параметра self, украсьте его как staticmethod:

class Solution(object):
    @staticmethod
    def twoSum(nums, target):
        compliment = []
        for ind, item in enumerate(nums):
            print(ind)
            if item in compliment:
                return [nums.index(target - item), ind]
            compliment.append(target - item)
        return [0, 0]

if __name__ == "__main__":

    final = Solution.twoSum([3, 3], 6)
    print(str(final))
...