globale Konstante innerhalb einer Klasse benutzen

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
skirnir
User
Beiträge: 36
Registriert: Sonntag 25. Januar 2015, 10:59

Hallo!

Sorry für das schlechte Subject, aber mein Problem ist genau, dass ich keinen Namen für mein Thema finde. Ich habe neulich folgendes Phänomen beobachtet (python 3.10.4):

Code: Alles auswählen

>>> __BAR = "hello world"
>>> class Foo:
...     def baz(self):
...         return __BAR
...
>>> f = Foo()
>>> f.baz()
Traceback (most recent call last):
  Cell In[5], line 1
    f.baz()
  Cell In[3], line 3 in baz
    return __BAR
NameError: name '_Foo__BAR' is not defined

>>> _Foo__BAR = "hello world"
>>> class Foo:
...     def baz(self):
...         return __BAR
...
>>> f = Foo()
>>> f.baz()
'hello world'
>>>
Kann mir jemand sagen, nach welchem Stichwort ich in der Doku (oder sonstwo) suchen muss, um eine Erklärung dafür zu finden?
skirnir
User
Beiträge: 36
Registriert: Sonntag 25. Januar 2015, 10:59

Super, Danke!
Benutzeravatar
sparrow
User
Beiträge: 4506
Registriert: Freitag 17. April 2009, 10:28

Wobei sich die Frage stellt, warum übrhaupt doppelte Anführungszeichen für Namen verwendet werden.
Es gibt ein ziemlich schlechtes deutsches Buch, in dem die Autoren versuchen Java und dessen Konzepte in Python zu pressen und so etwas verwenden um zu deklarieren, was private und was public in einer Klasse ist. Das kann man getrost als falsch ansehen und einfach nicht tun.
skirnir
User
Beiträge: 36
Registriert: Sonntag 25. Januar 2015, 10:59

Berechtigter Einwand. Das ist mir bei einem Code-Review begegnet, ist also nicht mein Code.
Immerhin konnte ich daraus was lernen.
Benutzeravatar
grubenfox
User
Beiträge: 593
Registriert: Freitag 2. Dezember 2022, 15:49

sparrow hat geschrieben: Dienstag 8. Oktober 2024, 12:34 Wobei sich die Frage stellt, warum übrhaupt doppelte Anführungszeichen für Namen verwendet werden.
das einzige was mir einfällt: verhindern dass die Namen in einer Klasse von abgeleiteten Klassen einfach überschrieben bzw. verdeckt werden können.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1206
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

So würde es gehen:

Code: Alles auswählen

class Foo:
    __SECRET = 42

    def __getattribute__(self, attribute):
        print("__getattribute__:", attribute)
        return super().__getattribute__(attribute)

    def baz(self):
        return self.__SECRET


print(Foo().baz())

Code: Alles auswählen

__getattribute__: baz
__getattribute__: _Foo__SECRET
42
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
bb1898
User
Beiträge: 216
Registriert: Mittwoch 12. Juli 2006, 14:28

sparrow hat geschrieben: Dienstag 8. Oktober 2024, 12:34 Wobei sich die Frage stellt, warum übrhaupt doppelte Anführungszeichen für Namen verwendet werden.
Anführungszeichen? Die sind doch Python völlig egal, so lange sie jeweils vorn und hinten zusammenpassen (mal abgesehen von """). Meintest Du die Unterstriche? Oder habe ich da eine Konvention verschlafen?
Benutzeravatar
DeaD_EyE
User
Beiträge: 1206
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Signle Quotes vs. Double Quotes. Ist doch völlig egal, was man verwendet. Hauptsache, es wird konsistent verwendet.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Benutzeravatar
__blackjack__
User
Beiträge: 13927
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Leute, das ist doch ziemlich offensichtlich eine Verwechslung und es waren Unterstriche gemeint. 🙄
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
Antworten