Python类/函数和自我参数

时间:2018-11-18 02:52:31

标签: python self

我有一些简单的代码来查找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行中进行简化。您可以看到我在此类中两次尝试调用该函数。第二次失败,除非我从函数参数中删除self参数。这是因为我试图传递2个参数而不是3个参数。

无论如何,我很困惑为什么我的两个实现不同,为什么一个可行而另一个却不可行。我也不确定在这里我什至不需要自我。似乎在拥有__init__并为类定义变量时,经常使用self。既然我不在这里,我什至根本不需要它吗?

2 个答案:

答案 0 :(得分:1)

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))

答案 1 :(得分:0)

您可以选择使用Python中的静态方法或类方法来装饰函数。对于类方法,您需要在方法签名中使用cls。这是一个很好的讨论,以区分两者:

What is the difference between @staticmethod and @classmethod?

顺便说一句—对于您的代码,我会高度建议使用集合而不是数组。这将使您的代码更加高效。检查目标值是否已经在集合中看到是平均的恒定时间操作。