Vererbung

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.
Antworten
JohannX
User
Beiträge: 110
Registriert: Mittwoch 27. März 2019, 17:07

Hallo zusammen!

Meine Frage richtet sich eher an die Vererbung wenn man das so sagen darf/kann.
Ich möchte, dass "def device" auf die oberen 2 def´s zugreifen kann/darf und werte Speichern.
Wie das mit class funktioniert weiß ich, nur weiß ich leider nicht wie ich das mit def mache.

Ich hoffe ihr könnt mir folgen :roll:

Code: Alles auswählen

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent = None):
        super().__init__(parent)
        
	Zeilen von Code....
	
	fig = go.Figure()
	
   def choose_button(self):
      	file = easygui.fileopenbox(msg="Please locate the asc file", title="Specify File", default="I:\*.asc")
        df_all = pd.read_csv
        
   def device(self):
       df_ubatlogger = df_all
       fig.add_trace
 
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Hast du mal ein Grundlagen-Tutorial zu Python und OO angeschaut? Denn da sollte sowas beschrieben sein. Zb wie man Instanzattribute anlegt, und darauf zugreift - self.fig = ....

Und du musst read_csv auch aufrufen. Nicht nur den Methodennamen hinschreiben. Gleiches gilt auch fuer add_trace.
Benutzeravatar
__blackjack__
User
Beiträge: 14045
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@JohannX: Die Frage hat nichts mit Vererbung zu tun. Überlege Dir mal was für einen Wert das Argument `self` hat. Und im Gegenzug: Eine Methode die dieses Argument nicht verwendet, ist eigentlich gar keine Methode und man muss sich ernsthaft fragen was die dann in der Klasse verloren hat.

Und Attribute sollten alle in der `__init__()`-Methode eingeführt werden. Wenn es nach einem Methodenaufruf mehr Attribute auf dem Objekt gibt, hat man etwas falsch, weil unübersichtlich und fehleranfällig, gemacht. Also auch wenn es zum Zeitpunkt an dem die `__init__()` abgearbeitet wurde noch keine `DataFrame`\s gibt, sollte das Attribut dafür bereits in der `__init__()` angelegt werden. Wenn man dort noch keinen sinnvollen Wert hat, ist `None` als Wert der genau das aussagt, üblich.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
JohannX
User
Beiträge: 110
Registriert: Mittwoch 27. März 2019, 17:07

@__deets__
@__blackjack__

Danke erstmals!
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Alles was Du in anderen Methoden verwenden willst, mußt Du an `self` binden.

ubatlogger und pressure ändern die Daten in ›df_all‹. Das heißt, beim zweiten mal Aufrufen kommt quatsch raus.

›ubatlooger‹ und ›pressure‹ sind bis auf 3 Werte identisch, können also in einer Funktion zusammengefasst werden.

Magische Werte sollten nicht irgendwo im Code auftauchen, sondern als Konstanten herausgezogen werden, damit der Code leichter lesbar wird.

Statt aus .ui-Dateien .py-Dateien zu erzeugen, solltest Du loadUI benutzen.

Code: Alles auswählen

DEFAULT_PATTERN = "I:\\*.asc"
OUTPUT_FILENAME = "data.html"
UBAT_LOGGER_TAG = "800200BA"
PRESSURE_TAG = "80083DCE"
UBAT_FACTOR = (5/4095)*8.655106
PRESSURE_FACTOR = 0.00257038
PRESSURE_OFFSET = -2*PRESSURE_FACTOR - 0.5

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent = None):
        super().__init__(parent)
        
        self.setWindowTitle("Bosch")
        self.ui = loadUi("mainwindow.ui",  self)
        self.ui.choose_button.clicked.connect(self.choose_button)
        self.ui.ubatlogger.clicked.connect(functools.partial(self.plot_data, "Ubatlogger", UBAT_LOGGER_TAG, lambda x: x*UBAT_FACTOR))
        self.ui.pressure.clicked.connect(functools.partial(self.plot_data, "Pressure", PRESSURE_TAG, lambda x: x*PRESSURE_FACTOR + PRESSURE_OFFSET)

        self.fig = go.Figure()
        self.data = None

    def choose_button(self):
        # Datei auswählen und trennen
        filename = easygui.fileopenbox(msg="Please locate the asc file", title="Specify File", default=DEFAULT_PATTERN)
        self.data = pd.read_csv(filename, skiprows=5, delimiter=";", converters={'  DATA L': partial(int, base=16)})

    def plot_data(self, name, tag, convert):
        selected_data = self.data[self.data["  DATA H"] == tag]
        time = selected_data["       Offset[s]"]
        values = convert(selected_data["  DATA L"])
        self.fig.add_trace(go.Scatter(x=time, y=values, mode="lines", name=name))

    def on_html_click(self):
        plotly.offline.plot(self.fig, filename=OUTPUT_FILENAME, auto_open=False)
Benutzeravatar
__blackjack__
User
Beiträge: 14045
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wenn ich mir die Zugriffe auf die Spalten des `DataFrame` anschaue, frage ich mich ob das `skipinitialspace`-Argument beim einlesen der Daten nicht vielleicht eine gute Idee gewesen wäre.

`easygui` irritiert mich. Das ist ein Modul das Tk(inter) als GUI verwendet, die Klasse benutzt aber eine Qt-Klasse als Basisklasse. Warum wird da so etwas gruseliges wie `easygui` verwendet, wenn man auch den Dateidialog von Qt verwenden könnte? Man sollte auf jeden Fall auch den Fall berücksichtigen, dass der Benutzer keine Datei auswählt, sondern den Abbrechen/Cancel-Knopf drückt.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Antworten