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.
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__
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.
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()
Zatem jeśli jest to tylko na potrzeby testu, to możesz porównywać q._k
z [150]
. Nie jest to może najlepszy test świata, bo polega mocno na szczegółach implementacyjnych, ale zadziała…
Inne rozwiązania to:
- Przeciążenie
__eq__
, jak wyżej. - Dodanie metody
to_list
, która będzie zwracała zawartość kolejki jako listy i testowanie tego. - 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.
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".
Dequeue powinno być O(1). U Ciebie jest O(n).
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