Seite 1 von 1

globale Konstante innerhalb einer Klasse benutzen

Verfasst: Dienstag 8. Oktober 2024, 10:22
von skirnir
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?

Re: globale Konstante innerhalb einer Klasse benutzen

Verfasst: Dienstag 8. Oktober 2024, 10:40
von grubenfox

Re: globale Konstante innerhalb einer Klasse benutzen

Verfasst: Dienstag 8. Oktober 2024, 10:50
von skirnir
Super, Danke!

Re: globale Konstante innerhalb einer Klasse benutzen

Verfasst: Dienstag 8. Oktober 2024, 12:34
von sparrow
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.

Re: globale Konstante innerhalb einer Klasse benutzen

Verfasst: Dienstag 8. Oktober 2024, 14:33
von skirnir
Berechtigter Einwand. Das ist mir bei einem Code-Review begegnet, ist also nicht mein Code.
Immerhin konnte ich daraus was lernen.

Re: globale Konstante innerhalb einer Klasse benutzen

Verfasst: Dienstag 8. Oktober 2024, 15:15
von grubenfox
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.

Re: globale Konstante innerhalb einer Klasse benutzen

Verfasst: Dienstag 8. Oktober 2024, 16:41
von DeaD_EyE
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

Re: globale Konstante innerhalb einer Klasse benutzen

Verfasst: Mittwoch 9. Oktober 2024, 16:19
von bb1898
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?

Re: globale Konstante innerhalb einer Klasse benutzen

Verfasst: Mittwoch 9. Oktober 2024, 20:32
von DeaD_EyE
Signle Quotes vs. Double Quotes. Ist doch völlig egal, was man verwendet. Hauptsache, es wird konsistent verwendet.

Re: globale Konstante innerhalb einer Klasse benutzen

Verfasst: Mittwoch 9. Oktober 2024, 22:36
von __blackjack__
Leute, das ist doch ziemlich offensichtlich eine Verwechslung und es waren Unterstriche gemeint. 🙄