【问题标题】:'MyList' object does not support item assignment“MyList”对象不支持项目分配
【发布时间】:2020-07-23 18:29:56
【问题描述】:

亲爱的, 我试图更好地理解 Python 中的 OOP 范式,所以我创建了这个简单的类

class MyList:
    def __init__(self,list):
        self.list=list

list1=MyList([1,2,3,4,5])

在一切正常之前,当我尝试为列表中的任何元素设置值时,就会出现问题。例如:

list1[0]=5

然后我得到了这个 TypeError: 'MyList' object does not support item assignment

有人可以帮我解决这个问题吗?

【问题讨论】:

标签: python class oop


【解决方案1】:

您的课程中没有任何代码允许分配项目。对于允许分配项目的对象,它需要实现__setitem__

你需要类似的东西:

class MyList:
    def __init__(self,list):
        self.list=list

    def __setitem__(self, i, elem):
        self.list[i] = elem

【讨论】:

  • 您好 Carcigenicate,感谢您的支持。我已经尝试过了,但我得到了同样的错误信息......
  • @blhsing 我做了,但由于某种原因,我在写下半部分时脑子里有一些查找。我不确定为什么。固定。
  • @ViniciusMiki 我有错误的方法。我是在听讲座时写的,显然我的大脑分心了。尝试更正后的代码。
【解决方案2】:

由于您试图更好地理解 OOP,您可以尝试以下方法:子类 list 本身,这样您的类就可以获得 lists 所做的所有属性。

class MyList(list):
    def __init__(self,list):
        super().__init__(list)

list1 = MyList([1,2,3,4,5])
list1[0] = 5

print(list1)
# [5, 2, 3, 4, 5]

【讨论】:

    【解决方案3】:
    class MyList:
        def __init__(self,list):
            self.list=list
        def __str__(self):
            return str(self.__dict__)
    
    list1=MyList([1,2,3,4,5])
    print(list1)
    
    list1.list[0]=5
    print(list1)
    

    您需要分配给列表属性而不是类

    【讨论】:

      【解决方案4】:

      您可能正在尝试创建一个新的 MyList 类型,它应该具有普通 Python 列表的功能以及您可能希望添加或修改的一些功能。为此,您需要从内置的 Python list 类继承,如下所示,

      class MyList(list):
          pass
      
      list1=MyList([1,2,3,4,5])
      
      list1[0]=5
      

      现在在您的 MyList 类中,仅定义您想要在内置 list 类中更改的方法

      【讨论】:

        【解决方案5】:

        我明白了! 我实现了特殊方法 setitem 和 getitem 并且它起作用了。谢谢大家

        class MyList:
            def __init__(self,list):
                self.list=list
        
            def __getitem__(self, index):
                return self.list[index]
            
            def __setitem__(self, index, value):
                self.list[index] = value
        

        【讨论】:

          猜你喜欢
          • 2015-03-09
          • 2019-01-03
          • 2016-06-03
          • 1970-01-01
          • 1970-01-01
          • 2016-07-31
          • 2012-01-22
          • 2014-02-18
          相关资源
          最近更新 更多