Funktionen und deren Aufruf

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
Ben_2003
User
Beiträge: 8
Registriert: Dienstag 22. April 2025, 19:17

Hallo zusammen,

in einer Klasse steht eine Funktion zum Abrufen eines Strings

Code: Alles auswählen

class Userdata:

    def mytoken(self) -> str:
        """Gibt das Token des Bots zurück."""
        return self._mybot.token if self._mybot else ""
Es ist ein Teil von einem Telegram-Bot.

Wenn diese Funktion aufgerufen wird...

Code: Alles auswählen

mytoken = my_usersettings.Userdata.mytoken
Dann enthält die Variable mytoken nicht den String, sondern einen Verweis zu der Funktion.

In anderen Themen wird berichtet, dass man in dem Fall die Funktion aufrufen muss:

Code: Alles auswählen

mytoken = my_usersettings.Userdata.mytoken()
In dem Fall wird der Fehler angezeigt, dass der Parameter self nicht angegeben wurde.

Wie muss die Funktion nun aufgerufen werden?
Sirius3
User
Beiträge: 18250
Registriert: Sonntag 21. Oktober 2012, 17:20

`my_usersettings.Userdata` ist die Klasse, Du brauchst aber eine Instanz der Klasse, die Du an irgendeiner anderen Stelle im Code erzeugt hast.
Es ist übrigens meist nicht sinnvoll, das Präfix my zu benutzten, insbesondere in Attributen nicht. Kann die Userdata-Klasse nur für Deinen Bot benutzt werden? Wenn Du also auch für Toms Bot Userdata brauchst, dann mußt Du dafür eine neue Klasse definieren? Und an allen Stellen, wo ein Token gebraucht wird, mußt Du dann toms_token() aufrufen? Da das sehr umständlich wäre, läßt man pPräfixe wie my einfach weg.
Ebenso sollten Module generisch definiert werden, nicht nur für eine Person, also `usersettings` statt `my_usersettings`.
Benutzeravatar
__blackjack__
User
Beiträge: 13997
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ergänzend noch: Methoden werden wie Funktionen üblicherweise nach der Tätigkeit benannt die sie durchführen, damit der Leser weiss was da passiert und um sie von eher passiven Werten unterscheiden zu können. Also `get_token()`. `token` wäre ein Name für das Token selbst, also für ein Datenattribut oder ein Property.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
Ben_2003
User
Beiträge: 8
Registriert: Dienstag 22. April 2025, 19:17

Vielen Dank für die Infos.

Das Präfix my wurde verwendet, um auf einem Blick die eigenen Methoden und Funktionen identifizieren zu können.

my_userdata enthält nur für einen User die Angaben. Der Telegram-bot kapselt bereits mehrere Aufrufe vom Bot so, dass man sich nicht um mehrere Instanzen des Telegram-Bot kümmern muss.
Benutzeravatar
__blackjack__
User
Beiträge: 13997
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Ben_2003: Die Klasse ist doch von Dir, dann muss ja nach der Logik vor *allen* Attributen und Methodennamen ein `my` stehen. Nur wenn das vor allen steht, unterscheidet man dieser unnötige Präfix gar nichts mehr, und ist damit überflüssig.

Aber selbst wenn man eine vorhandene Klasse beerbt und erweitert, macht man das nicht. Man sieht doch im Quelltext welche eigenen Methoden man geschrieben hat. Stell Dir mal vor das würde jeder machen, dann hätte man ja auch schon überall `my` davor stehen von anderen Programmierern. Dann müsstest Du die Methode `get_bens_token()` nennen, und hoffen, das kein anderer Ben da schon was programmiert hat. Das wäre alles ziemlich schräg. Und es wäre dann auch verwirrend wenn die Methode so heisst weil der Programmierer Ben heisst, aber das `token` letztendlich jemand anderem gehören würde.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
Benutzeravatar
Dennis89
User
Beiträge: 1516
Registriert: Freitag 11. Dezember 2020, 15:13

Vielleicht könnte man die Ben's noch durch nummerieren, damit es zu keiner Verwirrung kommt?

SCNR!
"When I got the music, I got a place to go" [Rancid, 1993]
Ben_2003
User
Beiträge: 8
Registriert: Dienstag 22. April 2025, 19:17

__blackjack__ hat geschrieben: Dienstag 27. Mai 2025, 11:56 Stell Dir mal vor das würde jeder machen, dann hätte man ja auch schon überall `my` davor stehen von anderen Programmierern.
Du hast Recht. Ich habe es schon geändert.

Die Methoden und Funktionen wurden nun gemäß ihren Funktionen benannt.
Antworten