重写__getitem__时,object不支持索引

时间:2017-07-05 22:53:36

标签: python

Solution类继承自对象类,发生TypeError:'Solution'对象不支持索引?但是如果Solution类不从对象继承,则代码可以找到。我的问题是为什么Solution类在从object继承时不支持索引,即使它覆盖 getitem 方法。

class Solution(object):
    def findMin(self, nums):
        self.__getitem__ = lambda i: nums[i] <= nums[-1]
        return nums[bisect.bisect(self, False, 0, len(nums))]

2 个答案:

答案 0 :(得分:3)

当您从object继承时,您将创建一个新样式类而不是旧样式类。对于新式类,__getitem__上查找,而不是在类的实例上查找。即使您已将__getitem__方法添加到类实例self),您也无法将该方法添加到类中,因此也无法查找失败(对于新的样式类)。

对于旧样式类,大概是查找仍然在实例上发生,这就是为什么代码在您不从object继承时起作用的原因。但是要小心 - 在python3.x中,无论是否明确地从object继承,所有类都是新风格。

答案 1 :(得分:0)

你需要这样做:

import bisect

class Solution(object):
    __getitem__ = lambda self, i: self.nums[i] <= self.nums[-1]

    def findMin(self, nums):
        self.nums = nums
        return nums[bisect.bisect(self, False, 0, len(nums))]

sol = Solution()
sol.findMin([42, 1, 13])

__getitem__需要在类中定义,而不是在新样式的类中定义(Python 2中基类为object的类,以及Python 3中的所有类 - 是否明确指定与否。)