问题描述
我正在做有关制作模块的作业,过去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)