关于使用方括号调用类的实例

问题描述

我正在做有关制作模块的作业,过去5个小时我一直在为此苦苦挣扎,我需要帮助来了解这一点。

我必须制作一些可以交互的类,这是我到目前为止编写的代码。

#----------------------------------------
#This class makes an element to put inside a piece of the block

class Element:
    def __init__(self,tipus,alcada):
        self.tipus = tipus
        self.alcada = alcada

#---------------------------------------------------------------
#This class makes a block separated in "ncossos" number of pieces

class MobleModular:
    alt = 0
    ample = 0
    ncossos = 0

    def __init__(self,alt,ample,ncossos):
        global dict
        self.alt = alt
        self.ample = ample
        self.ncossos = ncossos

        #-------------------------------------
        #This is the only way i know of making a database for each piece of the block

        dict = {}
        for x in range(self.ncossos):
            dict[x] = []

        #This returns {0: [],1: [],2: [],3: []} using number 4 in "ncossos" at __init__

然后我必须使用Element()创建要存储在每个列表中的元素,所以我做到了这一点

    def afegir(self,nc,alcada):
        self.nc = nc #I access the dictionary with this number
        self.tipus = tipus
        self.alcada = alcada
        y = Element(tipus,alcada)
        dict[nc].append(y)

#--------------------------------
#Then i enter the following values

m.afegir(0,'A',90)
m.afegir(0,'C',20)
m.afegir(0,30)
m.afegir(1,90)
m.afegir(1,20)
m.afegir(1,30)
m.afegir(2,'B',40)
m.afegir(2,30)
m.afegir(3,60)
m.afegir(3,70)
m.afegir(3,30)

现在我的列表中充满了对象,这没关系,因为我可以调用“ dict [0] [0] .tipus / alcada”来获取对象值

这是问题开始的地方,练习要求我这样做,由于我不知道如何解释,因此我将进行演示

x = m[1,3]

#The first number being the dictionary position and the second number being the nested list position,#so it returns the THIRD element from the FIRST piece of the block

#And when i call:

x.tipus,x.alcada

#It has to return:

('C',20)

我该怎么办?我需要使用方括号调用实例,然后将位置的对象分配给新变量

解决方法

您应该简化逻辑以简化编码。.创建“数据库”时,只需将数据存储为元组即可。检索特定索引时,创建一个新的Element对象并返回它。

尝试以下代码:

class Element:
    def __init__(self,tipus,alcada):
        self.tipus = tipus
        self.alcada = alcada

class MobleModular:
    def __init__(self):
        self.lst = []  # list of tuples

    def afegir(self,nc,alcada):
        self.lst.append((nc,alcada))  # add tuple
        
    def __getitem__(self,idx):  # for brackets
        lst = [x for x in self.lst if x[0] == idx[0]]  # find tuples by first index
        e = lst[idx[1]-1]  # get specific tuple
        return Element(e[1],e[2])  # return new element object

m=MobleModular()

m.afegir(0,'A',90)
m.afegir(0,'C',20)
m.afegir(0,30)
m.afegir(1,90)
m.afegir(1,20)
m.afegir(1,30)
m.afegir(2,'B',40)
m.afegir(2,30)
m.afegir(3,60)
m.afegir(3,70)
m.afegir(3,30)

x = m[1,3]
print((x.tipus,x.alcada))  # ('C',20)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...