Zwracany obiekt z klasy

0

Cześć, mam pewien problem ze zwracanym obiektem z mojej klasy. Chodzi o to, że.
Mam klasę elementu, która wygląda tak:

class Element:
    def __init__(self, imie, numer):
        self._imie         = imie
        self._numer       = numer

    def __repr__(self):
        return ('n:{0}, r:{1}'
            .format(self._imie, self._numer))

Dzięki temu, jeżeli zrobię

p = Element('Rysiek',22)
print(p)

to dostanę:

n:'rysiek', r:22

Robię teraz listę takich elementów i przekazuję ją do klasy Engine, która wykonuje jakieś operacje na tej liście i ją zwraca:

class Engine:
    def __init__(self, mojaLista):
        self._mojaLista = list(mojaLista)
(...)

return self._mojaLista

Problem w tym, że jeżeli w klasie Engine zamiast return zrobię print(self._mojaLista) to ładnie na ekranie widzę:

n:'rysiek', r:22,n:'mietek', r:25,n:'Stasiek', r:28

Jeżeli jednak zostanę przy return i następnie:

lista = Engine(przekazanaLista)
print(lista)

to zamiast podobnego rezultatu jak powyżej dostę:

<Engine object at 0x02CD8C88>

Podpowiecie mi jak przekazać z klasy na zewnątrz te wartości, które w klasie bez problemu mogę printnąć? Coś mi umyka :(

2

Wykorzystaj magiczną metodę __str__. Na przykład interesujący Cię output można uzyskać z następującym kodem:

class Element:

    def __init__(self, name: str, number: int) -> None:
        self._name = name
        self._number = number

    def __str__(self) -> str:
        return f'n:{self._name}, r:{self._number}'


class Engine:

    def __init__(self, element_list: list) -> None:
        self._list = element_list

    def __str__(self) -> str:
        return ','.join(el.__str__() for el in self._list)


if __name__ == '__main__':
    a = Element('Adam', 22)
    b = Element('Ola', 19)
    c = Element('Marta', 23)

    lst = [a, b, c]
    engine = Engine(lst)
    print(engine)  # n:Adam, r:22,n:Ola, r:19,n:Marta, r:23
0

Bardzo Ci dziękuję. @Pyxis mam jeszcze jedno pytanie. Co w sytuacji kiedy chciałbym wyświetlić na ekranie dane tak jak jest zaprezentowane w Twoim przykładzie ale w samym kodzie korzystać z tego co zwróciła klasa jak z obiektu? Próbowalem zrobić tak, że str zwraca string a repr zwraca obiekt ale kiedy zrobiłem poza klasa:

p = Engine(lst)
print(p)

for x n p:
   print("Element", x)

To dostałem wynik:

n:Adam, r:22,n:Ola, r:19,n:Marta, r:23
for x in engine:
TypeError: 'Engine' object is not iterable
1

Brakuje Ci metody iteracyjnej:

from typing import Iterator

class Element:

    def __init__(self, name: str, number: int) -> None:
        self._name = name
        self._number = number

    def __str__(self) -> str:
        return f'n:{self._name}, r:{self._number}'

class Engine:

    def __init__(self, element_list: list) -> None:
        self._list = element_list

    def __str__(self) -> str:
        return ','.join(el.__str__() for el in self._list)

    def __iter__(self) -> Iterator[Element]:
        for el in self._list:
            yield el


if __name__ == '__main__':
    a = Element('Adam', 22)
    b = Element('Ola', 19)
    c = Element('Marta', 23)

    lst = [a, b, c]
    engine = Engine(lst)
    print(engine)  # n:Adam, r:22,n:Ola, r:19,n:Marta, r:23

    for el in engine:
        print(el)

    # n:Adam, r:22
    # n:Ola, r:19
    # n:Marta, r:23
0

Wielkie dzieki!

1 użytkowników online, w tym zalogowanych: 0, gości: 1