Объект, атрибут которого является списком, в котором хранятся объекты

У меня есть класс с именем «Vol», в котором одним из его атрибутов является список с именем «seients», и у меня есть метод, в котором он добавляет место в атрибут списка объекта.

class Vol():
    def __init__(self):
        self.codi = None
        self.data = None
        self.companyia = None
        self.tipus_avio = None
        self.desti = None
        self.origen = None
        self.seients = []

    def pintaDades(self):
        print("codi: ", self.codi)
        print("data: ", self.data)
        print("companyia: ", self.company)
        print("tipo de avio: ", self.tipo_avion)
        print("desti: ", self.desti)
        print("origen: ", self.origen)

    def inicialitzaTeclat(self):  # lo mismo que creaVol() de la practica 1
        self.codi = str(input("Introduce Codi: "))
        self.data = self.comprovarData(str(input("Introduce data: ")))
        while not self.data:  # entrara en el bucle siempre y cuando data= TRUE, y se debera repetir otra vez el ingreso de la variable
            self.data = str(input("Introduce data: "))  # data=comprovarData(str(input("Introduce data:")))
            self.data = self.comprovarData(self.data)
        self.company = str(input("Introduce Companyia: "))
        self.tipo_avion = str(input("Introduce tipo de Avion: "))
        self.desti = str(input("Introduce destino: "))
        self.origen = str(input("Introduce origeno: "))

    def afegeixSeient(self, seat):  # meter seient en la lista seients
        self.seients.append(seat)  # agrega a la lista el objeto seient ==> seients = seients +[seat]

    def pintaSeient(self):  # muestra todos los asientos del vuelo, recorrer lista
        i = 0
        if len(self.seients[:]) > 0:  # si hay algo en la lista
            while i < len(self.seients[:]):
                print(self.seients[i].fila, self.seients[i].lletra)
                i = i + 1
        else:
            print("lista de asientos vacia.")

У меня есть другой класс под названием «Сиденье»:

class Seient():
        fila=None
        lletra=None

    def pintaDades(self):
        print("fila: ",self.fila)
        print("lletra: ",self.lletra)

    def inicialitzaTeclat(self):
        self.fila=str(input("Inserta fila: "))
        self.lletra=str(input("Inserta lletra: "))

В Основную программу я добавлю только тот фрагмент, который, как мне кажется, меня не подводит, поскольку он довольно длинный, он содержит несколько функций, в которых это 'createVol', эта функция в основном создает полет, и если все атрибуты полета верны, то может случиться добавить места полета, которые будут добавлены в атрибуте 'seient' класса Vol:

def crearVol():
    v=Vol() #intancia class Vol
    v.inicialitzaTeclat()   #metodo para introducir cosas del vuelo
    s=Seient()
    s.inicialitzaTeclat()
    v.afegeixSeient(s)       #metodo para intrudir asiento
    v.pintaDades()
    v.pintaSeient()
    opcio=(str(input("Voleu introduir un altre seient? (S/N) "))).upper()       # opcio.upper, convertimos en mayus
    while opcio[0]=="S":
        s.inicialitzaTeclat()
        v.afegeixSeient(s)       #metodo para intrudir asiento
        v.pintaDades()
        v.pintaSeient()
        opcio=(str(input("Voleu introduir un altre seient? (S/N) "))).upper()

Проблема в том, что каждый раз, когда я вхожу в запись, и она сохраняется в атрибуте 'seient' класса Vol, первая введенная запись исчезает, а вторая добавляет ее в индексы 0 и 1 списка 'seient' то есть я оставляю вам пример.

пользователь ввел 2 места в полете, первое место - «1A», а следующее До '2E', я должен сказать, что место также является классом типа 'seient', поэтому список будет содержать объекты 'seient'.

список должен иметь места, хранящиеся следующим образом,

self.seient=[<__main__.Seient object at 0x000001D223B94B70>,<__main__.Seient object at 0x000001D223B95F70>]

Если мы распечатаем места, которые они должны покинуть

>>>A1
>>>2E

Но дело в том, что я не получаю это, атрибут seient, сохраняет мне последнюю запись, введенную во все индексы списка а остальные места потеряны.

self.seient=[<__main__.Seient object at 0x000001D223B94B70>,<__main__.Seient object at 0x000001D223B94B70>]

Если бы мы напечатали это, оно вышло бы.

>>>2E   # Este debería ser A1
>>>2E

Может ли кто-нибудь сказать мне, что я делаю неправильно?

1
задан 28.11.2019, 13:45
1 ответ

В python огромная mayorГ - в элементов это объекты... и эти управляют формы о implГ-встрече посредством указателей потом в следующем примере:

s = Seient()
s2 = s

Обе переменные указывают на тот же объект.

, Чтобы это предотвращать, ты должен убеждаться создания новых объектов каждый раз:

while opcio[0]=="S":
    s = Seient() # Nuevo objeto
    s.inicialitzaTeclat()
    v.afegeixSeient(s)       #metodo para intrudir asiento
1
ответ дан 01.12.2019, 10:40
  • 1
    Большое спасибо, вчера я был mirá ndolo пара часов и он не знал, потому что, или что он происходил – javic 28.11.2019, 14:00