Path: csiph.com!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail From: "Peter Heitzer" Newsgroups: de.comp.lang.python Subject: Re: [Python-de] Was ist an dieser Klasse falsch? Date: 30 Jul 2020 08:50:49 GMT Lines: 70 Message-ID: References: <2346874.32mHK6UKXk@palindrom> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Trace: individual.net VnAWf6UXG6jq98nNAxNHxA4UAyAnLjX6+qvG2OCR6M6COhte7Mi/0qTfni X-Orig-Path: not-for-mail Cancel-Lock: sha1:OIaC6opaxADL/R/FHW9MOWWXOmk= User-Agent: tin/2.4.1-20161224 ("Daill") (UNIX) (Linux/4.9.0-12-amd64 (x86_64)) Xref: csiph.com de.comp.lang.python:5656 Peter Otten <__peter__@web.de> wrote: >Am Do Juli 30 2020, 07:56:54 schrieb Peter Heitzer: >> Peter Heitzer wrote: >> >Ich habe ein Verständnisproblem mit folgendem kleinen Stück Javacode: >> > >> >import java.util.*; >> > >> >public class P extends Properties { >> > >> > public String getProperty(String p) { >> > >> > return super.getProperty(p,"de"); >> > >> > } >> > >> > public static void main(String[] args) { >> > >> > P x=new P(); >> > x.setProperty("a","b"); >> > System.out.println(x.getProperty(args[0])); >> > >> > } >> > >> >} >> > >> >Es wird ohne Fehler übersetzt. Wenn man es aber startet bricht es mit >> >Stackoverflow ab. Ich kann mir nicht erklären, was hier passiert. >> >Die abgeleitete Klasse P überschreibt die Methode getProperty(String) und >> >ruft darin die Originalmethode getProperty(String,String) auf. >> >Das Laufzeitverhalten mit Stackoverflow schaut aber für mich so aus, als >> >ob die überschriebene Methode sich selbst aufruft. >> >Wer kann mir das Verhalten erklären? >> >> Sorry falsche Gruppe. >Meine Java-Kenntnisse sind angestaubt, aber ich versuch mich mal an einer >"Übersetzung": >class Properties: > def getPropertyDefault(self, name, default): > try: > return self.getProperty(name) > except ValueError: > return default > def getProperty(self, name): > return 42 >class P(Properties): > def getProperty(self, name): > return super().getPropertyDefault(name, "de") >try: > print(P().getProperty("foo")) >except Exception as err: > print(err) >$ python3 property.py >maximum recursion depth exceeded while calling a Python object >Wenn diese Übersetzung korrekt ist besteht das Problem möglicherweise in den >unterschiedlichen Signaturen, du überlädst die eine die dann intern von der >anderen wieder aufgerufen wird. Zu der Erkenntnis hat mich ein Kollege auch gerade gebracht. Durch meine Überladung der einparametrigen Methode getProperty(String) ist in der Superklasse die ursprüngliche Implementierung nicht mehr sichtbar und wenn die Originalmethode mit 2 Parametern intern die einparametrige aufruft (was in der Quelle klar erkennbar ist) dann wird meine überladene Methode aufgerufen, welche sich dann rekursiv selber aufruft. -- Dipl.-Inform(FH) Peter Heitzer, peter.heitzer@rz.uni-regensburg.de