Powrót do: Podstawy Testów Automatycznych w Selenium i Python cz. 5 – Profesjonalna konfiguracja projektu
Pośrednia klasa bazowa
W tej lekcji dodamy nową klasę SmartDevice
. Będzie to taka klasa pośrednia. Dlaczego pośrednia?
Otóż jak napisaliśmy w poprzedniej lekcji nie możemy nic zmieniać w klasie Device
. Dodamy więc nową klasę pośrednią, która będzie dziedziczyć po klasie bazowej. Nazwiemy ją SmartDevice()
.
Chcemy aby przejęła ona wszystkie właściwości klasy, której nie chcemy edytować czyli Device
. To będzie bardzo proste 🙂 Wystarczy, że użyjemy dziedziczenia czyli dodamy do kodu naszej klasy wartość w nawiasach: SmartDevice(Device)
.
Cały kod nowej klasy:
class SmartDevice(Device): pass
Zaraz potem możemy w naszych klasach dziedziczących zmienić ich klasę bazową z Device
na SmartDevice
. Czyli sprytnie stworzymy taki sposób dziedziczenia:
Device -> SmartDevice -> MobilePhone, SmartWatch
Zobacz jak to wygląda w kodzie:
class Device(): def __init__(self, dev_name): self.name = dev_name def turn_on(self): print(f"Device {self.name} turned on") def turn_off(self): print(f"Device {self.name} turned off") def ring(self): print(f"Device {self.name} ringing") class SmartDevice(Device): pass class MobilePhone(SmartDevice): def game_mode(self): print(f"Device {self.name} set to game mode") def exchange_data(self): print(f"Device {self.name} exchanging data") def update(self): print(f"Device {self.name} is being updated") class SmartWatch(SmartDevice): def update(self): print(f"Device {self.name} is being updated") def measure_heart_rate(self): print(f"Device {self.name} measuring_heart_rate") def exchange_data(self): print(f"Device {self.name} exchanging data") print(f"Device {self.name} checking connection with mobile phone")
Uruchom kod i zobacz czy zachowuje się tak jak poprzednio. Dzięki temu zabiegowi uzyskaliśmy pełne wsparcie naszych metod dziedziczących po klasie Device
i jednocześnie możemy dalej refaktorować kod nie zmieniając chronionej klasy Device
😀
Mini teraz Ty – Refaktor wydzielanie
Wydziel do naszej pośredniej klasy metodę update()
. Oczywiście uruchom kod i sprawdź czy wynik jest identyczny jak poprzednio!
Mini teraz Ty – Rozwiązanie Refaktor wydzielanie
Wycinanie i wklejanie powinno pójść szybko, łatwo i przyjemnie 😀 Zobacz nasza propozycję:
class Device(): def __init__(self, dev_name): self.name = dev_name def turn_on(self): print(f"Device {self.name} turned on") def turn_off(self): print(f"Device {self.name} turned off") def ring(self): print(f"Device {self.name} ringing") class SmartDevice(Device): def update(self): print(f"Device {self.name} is being updated") class MobilePhone(SmartDevice): def game_mode(self): print(f"Device {self.name} set to game mode") def exchange_data(self): print(f"Device {self.name} exchanging data") class SmartWatch(SmartDevice): def measure_heart_rate(self): print(f"Device {self.name} measuring_heart_rate") def exchange_data(self): print(f"Device {self.name} exchanging data") print(f"Device {self.name} checking connection with mobile phone")
a druga sprawa juz dotyczaca tej sekcji to chyba klasa SmartDevice powinna wygladac tak:
class SmartDevice(Device):
def ring(self):
print(f”Device {self.name} ringing”)
skoro Device ma byc nie zmieniony
Też tak można, my założyliśmy na końcu lekcji https://jaktestowac.pl/lesson/pt1-mk5-s08-02/, że
ring()
pozostanie w klasieDevice()
i dopiero po tej zmianie uznajemy ją jako niemodyfikowalną 😀nie moge dodac komentarza do wczezsniejszej storny wiec zapytam tutaj:
dlaczego jak dziedziczycie to bez parametrow? czy __init__ tez powinien dziedziczyc z Device?
class Device():
def __init__(self, dev_name):
self.name = dev_name
def turn_on(self):
print(f”Deivce {self.name} turned on”)
def turn_off(self):
print(f”Device {self.name} turned off”)
def ring(self):
print(f”Device {self.name} ringing”)
class MobilePhone(Device):
def game_mode(self):
print(f”Device {self.name} set to game mode”)
def exchange_data(self):
print(f”Deivce {self.name} exchanging data”)
def update(self):
print(f”Deivce {self.name} is being updated”)
class SmartWatch(Device):
def update(self):
print(f”Deivce {self.name} is being updated”)
def measure_heart_rate(self):
print(f”Device {self.name} measuring_heart_rate”)
def exchange_data(self):
print(f”Deivce {self.name} exchanging data”)
print(f”Deivce {self.name} checking connection with mobile phone”)
Jak nie masz w dziedziczonych metodach własnego
__init__
to automatycznie dziedziczysz__init__
po rodzicu – i tak samo dzieje się z wymaganymi parametrami. Nie trzeba ich nigdzie podawać w deklarowanej klasie.Jeśli potrzebujesz rozszerzyć metodę __init__ w danej klasie to wtedy możesz to zrobić tak :
Gdzie
Odpowiada za inicjację parametrów klasy rodzica