Porównywanie instacji klasy do listy

Porównywanie instacji klasy do listy
RZ
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 20
0

Czesc, mam taki pytanie. Napisałem klasę która tworzy kolejke i jestem w trakcie pisania testów. Załóżmy że w kolejce q mam jeden element o wartosci 1. Czemu podczas testu q == [1] wyrzuca mi false? Kolejka jest tworzona jako lista.

Althorion
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1620
2

W Pythonie == bazuje na metodzie __eq__, której domyślna implementacja sprawdza najpierw, czy oba obiekty są tej samej klasy — a Twoja własna klasa to nie to samo, co wbudowana klasa listy.

Jeśli chcesz dokonywać takich porównań, przeciąż tę metodę.

EDYCJA: istotna lektura: __hash__ i jak się to ma do __eq__

PerlMonk
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa 🐪
  • Postów: 1719
0
Rzemysł napisał(a):

Napisałem klasę

Chciałbym zobaczyć kod, który uruchamiasz. Kolega w odpowiedzi wyżej ma rację, ale ja chciałbym się upewnić czy piszecie o tym samym.

RZ
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 20
1

Kod:

Kopiuj
class Queue:

    def __init__(self):
        self._k = []

    def empty(self):
        return self._k== []

    def detach(self):
        front = self._k[0]
        self._k.pop(0)
        return front

    def attach(self, x):
        self._k.append(x)

    def front(self):
        return self._k[0]

    def __str__(self):
        return str(self._k)

def test():
    q = Queue()
    q.attach(150)
    print(q == [150])

test()


Althorion
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1620
0

Zatem jeśli jest to tylko na potrzeby testu, to możesz porównywać q._k[150]. Nie jest to może najlepszy test świata, bo polega mocno na szczegółach implementacyjnych, ale zadziała…

Inne rozwiązania to:

  1. Przeciążenie __eq__, jak wyżej.
  2. Dodanie metody to_list, która będzie zwracała zawartość kolejki jako listy i testowanie tego.
  3. Testowanie czy front zwróci to, co trzeba.

Ogólnie — w testach chcesz, niemal zawsze, badać poprawność zewnętrznych interfejsów klas, nie ich wewnętrzne działanie. To, co klasa będzie miała „w środku”, jaką listę (i czy w ogóle listę), to szczegół implementacyjny — coś, czego testować nie powinieneś. Ty chcesz na przykład sprawdzać, czy jak coś włożysz attach, a potem wyjmiesz detach, to będzie to samo: bo wtedy testujesz zachowanie klasy, jej interfejs. Czyli jedyne, co tak naprawdę interesuje użytkowników.

lion137
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5025
0

Nadpisz chociaż __eq__, __repr__ i indeksowanie (__get__), żeby to jakoś wyglądało :), a tu:
https://rszalski.github.io/magicmethods/
Masz czytankę o tzw. "magic methods".

  • Rejestracja: dni
  • Ostatnio: dni
0

Dequeue powinno być O(1). U Ciebie jest O(n).

RZ
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 20
0

Dziękuję wam wszystkim za rady, dopiero zaczynam z obiektówką i algorytmami. Jeżeli macie jakieś fajne poradniki do oop czy algorytmów, takie np jak podesłał @lion137, to będę bardzo wdzięczny

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.