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

4 komentarze

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

    Avatar Dawid Kowalczyk
  2. 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”)

    Avatar Dawid Kowalczyk
    1. 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 :

      class SmartWatch(Device):
          def __init__(self, name, type):
              super().__init__(name)
              self.type = type
      
          def update(self):
              print(f"Deivce {self.name} is being updated")
      

      Gdzie

              super().__init__(name)
      

      Odpowiada za inicjację parametrów klasy rodzica

      Przemek Barański Przemek Barański

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *