Seite 1 von 1

attribute error: class has no attribute - aber warum?

Verfasst: Mittwoch 29. Juni 2016, 09:52
von ramsy
Hallo zusammen,

ich bin neu in python und befasse mich erstmalig mit der Nutzung verschiedener Dateien (bsp.: classes.py, functions.py etc.) und Klassen.

Ich habe eine Datei csconfig.py in der es eine Funktion namens getcsconfig gibt. Dies fängt vier Benutzereingaben ab. Am Ende der Datei gibt es ein

Code: Alles auswählen

newConfigReturn = classes.ConfigReturn(InputFile, WarCsConfigPath, WarLoggerConfigPath, Repositories)
    return newConfigReturn(InputFile, WarCsConfigPath, WarLoggerConfigPath, Repositories)
In der Datei classes.py wird die Klasse ConfigReturn deklariert:

Code: Alles auswählen

class ConfigReturn:
    def __init__(self, InputFile, WarCsConfigPath, WarLoggerConfigPath, Repositories):
        self.i = InputFile
        self.wc = WarCsConfigPath
        self.wl = WarLoggerConfigPath
        self.r = Repositories

    def __call__(self, *args, **kwargs):
        pass
Nun möchte ich die Eingaben aus csconfig.py an eine andere Funktion in der Datei build.py weitergeben. Diese sieht so aus:

Code: Alles auswählen

# unzip the reference warfile and build $n instances
def unzip(ConfigReturn):

    InFile = ConfigReturn.i
    Repositories = ConfigReturn.r
...
...
...
Dabei erhalte ich den Fehler:

Code: Alles auswählen

Traceback (most recent call last):
  File "wargen.py", line 30, in <module>
    build.unzip(classes.ConfigReturn)
  File "/root/PycharmProjects/build.py", line 18, in unzip
    InFile = ConfigReturn.i
AttributeError: class ConfigReturn has no attribute 'i'
Ich verstehe nicht, war er diese Meldung bringt, Kann mir jemand helfen?

Danke euch vorab.

Re: attribute error: class has no attribute - aber warum?

Verfasst: Mittwoch 29. Juni 2016, 10:06
von BlackJack
@ramsy: Also die Aufteilung auf Module ist schon mal falsch. In Modulen werden Sachen zusammengefasst die Semantisch zusammen gehören. Nicht danach ob es Klassen oder Funktionen sind. Das wäre als wenn man Bücher nach Farbe oder Grösse in Regale sortiert, statt danach was für ein Thema sie behandeln.

Warum hat `ConfigReturn` eine `__call__()`-Implementierung die beliebige Argumente nimmt und dann damit nichts tut? Und warum rufst Du diese Methode dann auch tatsächlich auf, mit den gleichen Argumenten mit denen vorher `__init__()` aufgerufen wurde, obwohl das doch total sinnfrei ist? Zumal das ``return`` dort dann den Rückgabewert von `__call__()` zurück gibt, was `None` ist. Das heisst wenn Du tatsächlich diesen Wert weiterverwenden würdest, käme eine andere Meldung, nämlich das `NoneType` kein Attribut `i` hat.

Dann bitte mal ganz dringend in den Style Guide for Python Code schauen wie man Namen in Python konventionell schreibt. Namen die mit einem Grossbuchstaben anfangen sind Klassen. Variablen fangen immer mit einem Kleinbuchstaben an. Daran erkennt man nicht nur leicht beim lesen was eine Klasse ist und was nicht, sondern man kann Exemplare einer Klasse auch wie die Klasse benennen, nur eben klein, und kann dann trotzdem noch die Klasse selbst verwenden. Genau darüber stolperst Du hier nämlich anscheinend. Lauf Fehlermeldung übergibst Du `unzip()` die *Klasse* und nicht ein Exemplar das aus dieser Klasse erstellt wurde.

Wo wir bei Namen sind: `i`, `wc`, `wl`, und `r` sind keine guten Namen für Attribute. Und das ist vorsichtig ausgedrückt. Namen sollen dem Leser vermitteln was der Wert dahinter im Kontext des Programms bedeutet. Möglichst ohne rätselraten und suche nach der Definition, in der Hoffnung, dass es dort deutlicher wird.

Re: attribute error: class has no attribute - aber warum?

Verfasst: Mittwoch 29. Juni 2016, 10:35
von ramsy
Hallo BlackJack,

danke für deine Rückmeldung.

Ich habe __call__ genutzt weil ich den Fehler hier bekam:

Code: Alles auswählen

AttributeError: ConfigReturn instance has no __call__ method
Im Netz habe ich gelesen, dass mit Ihn eben so beheben kann. Ich sollte dass dann also wieder raus holen?

Ich werde die Namen meiner Klassen und Variablen anpassen. Ich habe mir den StyleGuide angeschaut. Vielleicht hilft es.

Danke Dir

Re: attribute error: class has no attribute - aber warum?

Verfasst: Mittwoch 29. Juni 2016, 10:44
von Sirius3
@ramsy: Du bekommst die Fehlermeldung dass keine __call__-Methode exisitert nur, weil Du versuchst, eine Instanz der Klasse ConfigReturn aufzurufen. Dass das sinnfrei ist, hat BlackJack ja schon geschrieben. Was ich mir unter einer ConfigReturn-Klasse vorstellen soll ist mir auch noch nicht klar. Return ist ein Vorgang aber kein Zustand; und Klassen speichern nunmal Zustände.