Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
类实例可以通过python中的索引访问吗?_Python_Oop_Indexing - Fatal编程技术网

类实例可以通过python中的索引访问吗?

类实例可以通过python中的索引访问吗?,python,oop,indexing,Python,Oop,Indexing,例如,我们有一个“代理”类,如下所示: class Agent: def __init__(self, number): self.position = [] self.number = number for i in range(number): self.position.append([0, 0]) 我可以通过以下方式创建该类的实例: agent = Agent(10) 然后通过以下

例如,我们有一个“代理”类,如下所示:

class Agent:

    def __init__(self, number):
        self.position = [] 
        self.number = number         
        for i in range(number):
             self.position.append([0, 0])
我可以通过以下方式创建该类的实例:

agent = Agent(10)
然后通过以下方式访问第i个代理的位置:

agent.position[i]
然而,这似乎不够优雅,对我来说,这有点违反直觉。相反,我想索引类实例本身。例如:

pos_i = agent[i].position

它应该返回与上面的单行代码相同的答案。有没有办法做到这一点?

如果要重载索引操作符,只需重载类中的
\uuu getitem\uuu
方法即可

class Agent:
    def __getitem__(self, key):
        return self.position[key]

>>> myobj = MyClass()
>>> myobj[3]

如果您想这样做,您只需要一个包含所有实例的类级容器

鉴于你的职位是按任意顺序创建的,我建议你使用字典

您只需填写类级别的“position”字典即可。然后,您可以实现
\uuuu getitem\uuu
方法从该字典中检索元素:

class Agent:
   position = {}
   def __new__(cls, pos):
       if pos in cls.position:
           return cls.position[pos]
       instance = super().__new__(cls)
       cls.position[pos] = instance
       return instance

   def __getitem__(self, item):
        return self.position[pos]
但是,这只允许您从实例检索给定位置的实例,即:

agent_5 = Agent(5)
agent_10 = agent_5[10] 
会起作用,但不会:

agent_10 = Agent[10] 
如果需要,您必须使用自定义元类,并将
\uuu getitem\uuu
方法放在那里:

class MAgent(type):
   def __getitem__(cls, item):
        return cls.position[pos]


class Agent(metaclass=MAgent):
   position = {}
   def __new__(cls, pos):
       if pos in cls.position:
           return cls.position[pos]
       instance = super().__new__(cls)
       cls.position[pos] = instance
       return instance

但是
position
是职位历史的列表吗?首先,你说的更多是不正确的。您不访问第i个代理的位置,而是访问代理的第i个位置。因此,是否可以创建代理的i个实例,或者这是多余的?关键是能够通过某种功能改变这些位置@WillemVanonSem但是这里你给一个代理附加了一个位置列表。嗯,我的目标是能够改变一个类实例的位置,否则它们就具有相同的属性。所以我的初始代码足以完成这个任务,对吗@威廉·瓦农森