Wywołanie metody klasy bazowej

0

Wywołuje metoę str z klasy Garage, potem metodę z klasy bazowej i tutaj nic się nie wyświetla z klasy bazowej. Dlaczego jak to naprawić
plik Garage.py

from Car import Car

class Garage(Car):

    def __init__(self):
        self._adress = ''
        
 def __str__(self):
        print('Samochody w garazu:')
        for obj in self.cars:
           sys.stdout.write("%s, " %obj)
        super(Car).__str__()
        return ''
obj = Garage()
print obj

plik Car.py

class Car(object):
    ....
def __str__(self):
        print('marka:' + str(self.marka))
        return ''
0

Bo wywołujesz metodę str z klasy object zamiast Car. Poprawnie w python 3 będzie super().__str__() a w python2 super(Garage, self).__str__()

0

'Garage' object has no attribute 'marka'

0

instancja obiektu Garage nie ma zmiennej marka.

0

Tak jak pisałem. Tworzysz instancję klasy Garage. Jej __init__ nie wywołuje __init__ klasy nadrzędnej (Car), która przypisuje zmienną marka bo instancji.

Problem jest zgoła inny. Działasz na skomplikowanym kodzie, którego kompletnie nie rozumiesz i próbujesz zgadywać - dlaczego? Tracisz potencjał nauki.

0

tworząc instancję klasy Garage ' class Garage(Car): '
wywołując teraz z pozoimu obiektu typu Garage metodę klasy Car co się dzieje?
w normalnym języku programowania było tak że klasa pochodna to klasa podstawowa + dodatkowe metody, atrybuty klasy pochodnej, a tutaj tak nie jest?

0

No jest tak. Ale nadpisujesz metodę __init__ więc nie wywołujesz metody __init__ klasy Car bo ją nadpisałeś.

0

jakie init? przecież ja wywołuje metodę str , nie tworze obiektu Car bo on przecież już istnieje, przynajmniej tak mi się wydaje

0

Dobra. Nie masz absolutnie żadnych podstaw Pythona a operujesz na skomplikowanym kodzie. To nie ma sensu bo musiałbym tutaj tworzyć poradnik od zera. Sugeruję trochę opamiętania bo to droga donikąd.

0

oczywiście, bo żle muwisz, już wiem co jest żle

0

Klasa Car prawdopodobnie w __init__() robi przypisanie self.marka.
Dlatego klasa Garage nie ma self.marka, bo nadpisuje __init__ klasy Car..

0
import sys
from Car import Car

class Garage(Car):

    def __init__(self, adr = '', stor = 0, car_a= 0, inf = ''):
        self._adress = adr
        self._storage_max = stor
        self._car_amount = car_a
        self._info = inf
        self.cars = []
        super().__init__()
         
    def __str__(self):
        print('Adres:{}\nPojemnosc:{}\nIlosc samo.:{}\ninfo:{}\n'.format(self._adress,
                                                                          self._storage_max,
                                                                          self._car_amount,
                                                                          self._info))

        print('Samochody w garazu:')
        for obj in self.cars:
           sys.stdout.write("%s, " %obj)
        super().__str__()
        return ''
        
obj = Garage()
#obj.add_car('kbc 12')
#obj.add_car('kbc 16')
#obj.delete_car('kbc 12')
print(obj)

teraz jest dobrze, tylko że nikt mi nie pwowiedział, że musze najpierw stworzyć instancję klasy bazowej, w normalnych językach programowania, klasa bazowa + pochodna jest połączona, dlatego nie wiedziałem o co cho

0

Przecież nie tworzysz tutaj instancji klasy bazowej.

1

Samochód jest takim rodzicem dla Garażu, jak Pocisk dla Czołgu...

Powinieneś mieć oddzielnie klasę Garage i klasę Car. Klasa Garage może zawierać obiekty typu Car, ale dokładanie do tego dziedziczenia to błąd.

3

Odniosę sie do jednej kwestii:

w normalnym języku programowania było tak że klasa pochodna to klasa podstawowa + dodatkowe metody, atrybuty klasy pochodnej, a tutaj tak nie jest?

Nie. To tak nie działa w Pythonie. W Pythonie wiele rzeczy opiera się o monkey-patching i takie rzeczy jak pola obiektów są dynamiczne. Możesz spokojnie zrobić sobie obiekty tej samej klasy z różnym zestawem pól:

class A:
    def f1(self):
        self.pole1 = "ala"
    def f2(self):
        self.pole2 = "ola"

I teraz dla takiej klasy zobacz co się dzieje jak robisz:

obj = A()
# obj.pole1 rzuci wyjątkiem, takiego pola nie ma!
obj.f1()
obj.pole1 # teraz już jest, właśnie je dodaliśmy w funkcji f1!
# obj.pole2 rzuci wyjątkiem, takiego pola nie ma!
obj.f2()
obj.pole2 # teraz już jest, właśnie je dodaliśmy w funkcji f2!

I teraz idąc dalej tym tokiem, jeśli w konstruktorze klasy pochodnej nie zawołasz konstruktora klasy bazowej to nie tyle pola z klasy bazowej nie dostaną wartości, co w ogóle ich nie będzie!

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