richtiges strukturieren von Programm Code / Konfigurations Datei

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Kalysto
User
Beiträge: 117
Registriert: Freitag 14. April 2017, 15:28

Hallo,

Ich versuche es einmal etwas anders darzustellen.
Ich möchte mit self.device welche in der Barcode Scanner.py erstellt wird auch in meiner Startseite.py zugreifen können konkret so:

Barcode Scanner.py

Code: Alles auswählen

from Startseite import Startseite

class main(SafeAreaView):
    def __init__(self):
        self.device = 'iPhone'
        
        startseite = Startseite()
        startseite.Anmeldung()

if _name__ == '__main__':
    main()
Startseite.py:

Code: Alles auswählen

class Startseite():
    def Anmeldung():
        print(self.device)
in diesem fall würde ich ein Fehler bekommen da self.device in der Startseite.py nicht existiert...

Fehlermeldung:

Code: Alles auswählen

AttributeError: 'Startseite' object has no attribute 'device'
Sirius3
User
Beiträge: 18266
Registriert: Sonntag 21. Oktober 2012, 17:20

Das Modul `Startseite` läßt befürchten, dass Du pro Klasse eine eigene Datei hast. Das ist unsinn, denn Module sollten zusammengehörende Teile bündeln, eine Klasse allein ist für ein Bündel im Normalfall zu wenig.
Module werden wie Methoden und Variablennamen komplett klein geschrieben. Klassen dagegen haben einen großen Anfangsbuchstaben.
Eine Methode braucht immer als erstes Argument `self`, `Anmeldung` hat aber gar kein Argument.
Und wenn Du ein Attribut in einer Methode brauchst, dann mußt Du es __init__ übergeben.
Es ist seltsam, dass Du mit der Inszanz von ›Main‹ nichts machst.

Code: Alles auswählen

class Startseite():
    def __init__(self, device):
        self.device = device

    def anmeldung(self):
        print(self.device)


class Main(SafeAreaView):
    def __init__(self):
        self.device = 'iPhone'
        
        startseite = Startseite(self.device)
        startseite.anmeldung()

if _name__ == '__main__':
    Main()
Benutzeravatar
Dennis89
User
Beiträge: 1538
Registriert: Freitag 11. Dezember 2020, 15:13

Code: Alles auswählen

from Startseite import Startseite


class MainIstEinDooferNameFuerDieKlasse:
    def __init__(self):
        self.device = "iPhone"


def main():
    hier_faellt_mir_nichts_ein = MainIstEinDooferNameFuerDieKlasse()
    startseite = Startseite(hier_faellt_mir_nichts_ein.device)
    startseite.melde_geraet_an()


if __name__ == "__main__":
    main()

Code: Alles auswählen

class Startseite:
    def __init__(self, device):
        self.device = device

    def melde_geraet_an(self):
        print(self.device)
https://docs.python.org/3/tutorial/classes.html

Nochmal, bleib erst mal in einer Datei, benenne die Klassen etc. ordentlich um und mach bitte eins nach dem anderen. Schau dir die ganzen Tipps aus der 1. Seite noch einmal an.
Ich will dich nicht demotivieren, aber ich glaube so kommen wir hier nicht zum Ziel.

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Kalysto
User
Beiträge: 117
Registriert: Freitag 14. April 2017, 15:28

Hallo Zusammen,

Danke für die Tipps und Hilfen ich habe zwischenzeitlich weiter probiert und komme nun an ein reißen Problem meiner Seite..

Ich habe folgenden Beispielcode:

Code: Alles auswählen

class BarcodeScanner():
    def __init__(self):
        self.devcie = 'iPhone'
        
        startseite = Startseite(self.devcie)
        startseite.anmeldung()
        
        print(startseite.test_1)
        
    def weitere_seiten():
        pass
    
class Startseite():
    def __init__(self, device):
        self.device = device
        
    def anmeldung(self):
        self.test_1 = 'test 1'
        test_2 = 'test 2'
        print(self.device)
    
if __name__ == '__main__':
    BarcodeScanner()
in dem bsp. ist es nun "nur" eine Variable (self.device) welche ich in der Anmeldung() benötige in dem richtigen Code sind es ein paar mehr...
ich möchte nun aber nicht jedesmal alle Variablen einzeln übergeben müssen gibt es da eine Möglichkeit das "ganze" self bzw. Objekt zu übergeben sodass ich darauf ganz normal zugreifen kann ?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Code: Alles auswählen

starseite = Startseite(self)
Kalysto
User
Beiträge: 117
Registriert: Freitag 14. April 2017, 15:28

__deets__ hat geschrieben: Samstag 15. April 2023, 13:49

Code: Alles auswählen

starseite = Startseite(self)
Danke schön, ich hatte das selbe vorhin versucht hatte aber einen Schreibfehler :oops:

wie sollte man self denn benennen in der zweiten Klasse:

Code: Alles auswählen

class BarcodeSacnner():
    def __init__(self):
        self.device = 'iPhone'
        
        startseite = Startseite(self)
        startseite.Anmeldung()
        
        print(startseite.test_1)
        
    def weitere_seiten():
        pass
    
class Startseite():
    def __init__(self, self_1):
        self.device = self_1.device
        
    def Anmeldung(self):
        self.test_1 = 'test 1'
        test_2 = 'test 2'
        print(self.device)
    
if __name__ == '__main__':
    BarcodeSacnner()
oder dürfte man so etwas machen:

Code: Alles auswählen

class Startseite():
    def __init__(self, self_1):
        self.self_1 = self_1
        
    def Anmeldung(self):
        self.test_1 = 'test 1'
        test_2 = 'test 2'
        print(self.self_1.device)
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wieso muss das irgendwas mit self heissen?!? Das kann doch Problemlos barcode_scanner heissen.
Kalysto
User
Beiträge: 117
Registriert: Freitag 14. April 2017, 15:28

__deets__ hat geschrieben: Samstag 15. April 2023, 15:08 Wieso muss das irgendwas mit self heissen?!? Das kann doch Problemlos barcode_scanner heissen.
gute Frage :) von mir aus schon ja ^^

würde man das so dann schreiben können ?:

Code: Alles auswählen

class Startseite():
    def __init__(self, barcode_scanner):
        self.barcode_scanner = barcode_scanner
        
    def Anmeldung(self):
        self.test_1 = 'test 1'
        test_2 = 'test 2'
        print(self.barcode_scanner.device)
sodass man in der `__init__` nicht alles erneut deklarieren müsste ?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ja, das kann man so schreiben. Kannst du doch auch einfach ausprobieren.

Und wo wir dabei sind: def Anmeldung ist nicht der PEP8-Konvention entsprechend. Das muss nur klein_mit_unterstrich sein.
Kalysto
User
Beiträge: 117
Registriert: Freitag 14. April 2017, 15:28

Probiert hatte ich es schon nur das es die richtige Schreibweise ist.

Hatte ich gesehen und geändert.

vielen Dank @__deets__
Antworten