Porównywanie instacji klasy do listy

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.

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__

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.

1

Kod:

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()


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.

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".

0

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

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

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