如何通过索引访问 Python 类属性?

问题描述

我有一个这样的 Django 模型:

~/pybombs/default/src/gr-your-OOT/

并且我希望能够访问带有索引的属性,因此,如果我编写 class Competitor(models.Model): """ Competitor model object """ name = models.CharField(max_length=20) easy = ArrayField(models.PositiveSmallIntegerField(),size=9,null=True,blank=True,verbose_name='Easy Mode') hard = ArrayField(models.PositiveSmallIntegerField(),verbose_name='Hard Mode') tematicas = ArrayField(models.PositiveSmallIntegerField(),size=7,verbose_name='Tematicas') random_score = ArrayField(models.PositiveSmallIntegerField(),verbose_name='Random Mode') min1 = ArrayField(models.PositiveSmallIntegerField(),verbose_name='minuto 1') min2 = ArrayField(models.PositiveSmallIntegerField(),verbose_name='minuto 2') deluxe = ArrayField(models.PositiveSmallIntegerField(),size=14,verbose_name='Deluxe') replica = ArrayField(models.PositiveSmallIntegerField(),verbose_name='Replica') ,它应该返回 competitor[0] 的值。

我看过了,根据 this 问题,我必须“同时实现 name__iter__()方法。”但我不知道在这方法中做什么。

有人知道怎么做吗?

解决方法

如果您只打算获取物品,则必须覆盖 __getitem__

class Competitor(models.Model):
  """
  Competitor model object
  """
  name = models.CharField(max_length=20)
  easy = ArrayField(models.PositiveSmallIntegerField(),size=9,null=True,blank=True,verbose_name='Easy Mode')
  hard = ArrayField(models.PositiveSmallIntegerField(),verbose_name='Hard Mode')
  tematicas = ArrayField(models.PositiveSmallIntegerField(),size=7,verbose_name='Tematicas')
  random_score = ArrayField(models.PositiveSmallIntegerField(),verbose_name='Random Mode')
  min1 = ArrayField(models.PositiveSmallIntegerField(),verbose_name='minuto 1')
  min2 = ArrayField(models.PositiveSmallIntegerField(),verbose_name='minuto 2')
  deluxe = ArrayField(models.PositiveSmallIntegerField(),size=14,verbose_name='Deluxe')
  replica = ArrayField(models.PositiveSmallIntegerField(),verbose_name='Replica')

  def __getitem__(self,key):
      if key == 0:
          return self.nome
      elif key == 1:
          return self.easy
      ...
      elif key == 8:
          return self.replica

一个简单的方法是使用列表跟踪属性:

class Competitor(models.Model):
  """
  Competitor model object
  """
  name = models.CharField(max_length=20)
  easy = ArrayField(models.PositiveSmallIntegerField(),verbose_name='Replica')
  _list = [name,easy,hard,tematicas,random_score,min1,min2,deluxe,replica]

  def __getitem__(self,key):
      return self._list[key]

为了完全实现下标符号 ([]),您还需要实现 __setitem____delitem__

  def __setitem__(self,index,value):
      self._list[index] = value
,

我不知道您是否可以在不映射每个索引的情况下进行此操作。如果您可以确保索引的顺序始终相同,那么这对您有用:

class Competitor:
    def __init__(self):
        self.name = 'Leonardo'

    def __getitem__(self,key):
        if key == 0:
            return self.name

if __name__ == "__main__":
    print(Competitor()[0])  # Leonardo
,

首先,我要感谢@julianofischer 的回答。它教会了我如何实现我将在此答案中实现的方法。

首先添加一个字符串列表,其中包含您希望能够使用 [] 作为类的属性访问的字段的名称,如下所示:

class Competitor(Model):
  """
  Competitor model object
  """
  name = CharField(max_length=20)
  easy = ArrayField(PositiveSmallIntegerField(),verbose_name='Easy Mode')
  hard = ArrayField(PositiveSmallIntegerField(),verbose_name='Hard Mode')
  tematicas = ArrayField(PositiveSmallIntegerField(),verbose_name='Tematicas')
  random_score = ArrayField(PositiveSmallIntegerField(),verbose_name='Random Mode')
  min1 = ArrayField(PositiveSmallIntegerField(),verbose_name='minuto 1')
  min2 = ArrayField(PositiveSmallIntegerField(),verbose_name='minuto 2')
  deluxe = ArrayField(PositiveSmallIntegerField(),verbose_name='Deluxe')
  replica = ArrayField(PositiveSmallIntegerField(),verbose_name='Replica')
  _list = [ 'easy','hard','tematicas','random_score','min1','min2','deluxe','replica' ]

然后,如果您想要获取和设置值,则必须实现 __getitem____setitem__,如下所示:

def __getitem__(self,index: int):
  return self.__dict__[self._list[index]]

def __setitem__(self,index: int,value: list):
  self.__dict__[self._list[index]] = value
  self.save(update_fields=[self._list[index]])

这样,您使用 __getitem__ 访问字段的值,使用 .__dict__[index] 并返回这些值,而使用 __setitem__,您直接修改这些值。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...