关于用括号调用 class 的实例

About calling an instance of a class with brackets

我正在做关于制作模块的作业,过去 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, tipus, 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, 'C', 20)
m.afegir(0, 'C', 30)
m.afegir(1, 'A', 90)
m.afegir(1, 'A', 30)
m.afegir(1, 'C', 20)
m.afegir(1, 'C', 30)
m.afegir(2, 'B', 30)
m.afegir(2, 'B', 30)
m.afegir(2, 'B', 30)
m.afegir(2, 'B', 40)
m.afegir(2, 'C', 30)
m.afegir(3, 'B', 60)
m.afegir(3, 'A', 70)
m.afegir(3, 'C', 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)

我到底该怎么做?我需要用括号调用我的实例,然后将位置的对象分配给一个新变量

您应该简化逻辑以使编码更容易。. 创建 'database' 时,只需将数据存储为元组。检索特定索引时,创建一个新的 Element 对象并 return 它。

试试这个代码:

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, tipus, alcada):
        self.lst.append((nc, tipus, 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, 'C', 20)
m.afegir(0, 'C', 30)
m.afegir(1, 'A', 90)
m.afegir(1, 'A', 30)
m.afegir(1, 'C', 20)
m.afegir(1, 'C', 30)
m.afegir(2, 'B', 30)
m.afegir(2, 'B', 30)
m.afegir(2, 'B', 30)
m.afegir(2, 'B', 40)
m.afegir(2, 'C', 30)
m.afegir(3, 'B', 60)
m.afegir(3, 'A', 70)
m.afegir(3, 'C', 30)

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