【问题标题】:About calling an instance of a class with brackets关于用括号调用类的实例
【发布时间】:2020-10-15 14:07:34
【问题描述】:

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

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

【问题讨论】:

    标签: python class module instance brackets


    【解决方案1】:

    您应该简化逻辑以使编码更容易。创建“数据库”时,只需将数据存储为元组。在检索特定索引时,创建一个新的 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, 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)
    

    【讨论】:

      猜你喜欢
      • 2010-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-07
      相关资源
      最近更新 更多