проблема с наследованием в питоне - PullRequest
1 голос
/ 22 июня 2010

в школе мы получили этот файл класса:

class Konto:
    def __init__(self, nummer):
        self.__nr = nummer
        self.__stand = 0
        self.__minimum = -1000.0

    def getStand(self):
        return self.__stand

    def getNr(self):
        return self.__nr

    def einzahlen(self, betrag):
        self.__stand = self.__stand + betrag

    def auszahlen(self, betrag):
        if self.__stand - betrag >= self.__minimum:
            self.__stand = self.__stand - betrag
        else:
            print("Auszahlung nicht möglich!")

class Sparkonto(Konto):
    def __init__(self, nummer):
        Konto.__init__(self, nummer)
        self.__zinssatz = None
        self.__minimum = 0
        self.__maxAuszahlung = 2000.0

    def setZinssatz(self, zinssatz):
        self.__zinssatz = zinssatz

    def getZinssatz(self):
        return self.__zinssatz

    def auszahlen(self, betrag):
        if betrag <= self.__maxAuszahlung:
            Konto.auszahlen(self, betrag)
        else:
            print("Auszahlung nicht möglich!")

    def zinsenGutschreiben(self):
        zinsen = self.__stand * (self.__zinssatz / 100)
        self.einzahlen(zinsen)

Когда я запускаю эту тестовую программу:

#Test
from sparkonto import *
s = Sparkonto(1)
s.einzahlen(1000)
print(s.getStand())
s.setZinssatz(4)
print(s.getZinssatz())
s.zinsenGutschreiben()
print(s.getStand())
s.auszahlen(2500)
print(s.getStand())

Я получаю эту ошибку

1000
4
Traceback (most recent call last):
  File "/home/malte/home/py3/sparkonto/test.py", line 8, in <module>
    s.zinsenGutschreiben()
  File "/home/malte/home/py3/sparkonto/sparkonto.py", line 44, in zinsenGutschreiben
AttributeError: 'Sparkonto' object has no attribute '_Sparkonto__einzahlen'
>>> 

Мы не знаем, что делаем неправильно. Есть предположения?

Ответы [ 3 ]

2 голосов
/ 22 июня 2010

Даниэль был на полпути, вам нужно поменять self.__einzahlen -> self.einzaheln, как он сказал.

Также, self.__stand принадлежит родительскому классу.С двойным подчеркиванием в имени, оно искажено, используется где-либо еще.Но вам не нужно использовать self.__stand напрямую.Конто дает вам getStand().

Попробуйте что-то вроде этого:

def zinsenGutschreiben(self):
    zinsen = self.getStand() * (self.__zinssatz / 100)
    self.einzahlen(zinsen)
1 голос
/ 22 июня 2010

Двойные начальные подчеркивания вызывают искажение имени, используя имя текущего класса. Вместо этого используйте одно начальное подчеркивание.

1 голос
/ 22 июня 2010

self .__ einzahlen (zinsen) -> self.einzahlen (zinsen)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...