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.
Es so nicht zu machen. Dieser Mechanismus ist genau NICHT dafür gemacht private Attribute zu spielen, sondern soll genau so funktionieren wie du es erlebst: potentielle namenskonflikte in Ableitungshierarchien lösen.
Nimm einfach der Konvention entsprechend nur EINEN unterstrich, und alles ist tutti.
@__deets__ : Hatte ich auch schon probiert, funktioniert weder mit einem Unterstrich noch ohne Unterstrich.
@sebastian22 : Dein Tipp war der Richtige ! Allerdings auch nur mit einem Unterstrich.
Was mir noch nicht ganz einleuchtet, ein privates Attribut soll doch von den Nutzern einer Instanz nicht gesehen werden. Eine erbende Klasse sollte doch aber die Möglichkeit haben. Ist ja eigentlich auch nötig (z.B. in meinem Fall).
@Karsten Böhme: es gibt keine privaten Attribute. Es gibt öffentliche Attribute (ohne Unterstrich), interne Attribute (mit einem Unterstrich) und Attribute, die nicht aus vererbten Klassen angesprochen werden sollen (zwei Unterstriche). Du hast die letzte Variante gewählt, obwohl Du auf ein vererbtes Attribut zugreifen wolltest, was dann, wie von Python vorgesehen, nicht funktioniert hat.
class A:
def __init__(self):
self._x = 1
class B(A):
def f(self):
x = self._x
return x
def main():
b = B()
print(b.f())
if __name__ == '__main__':
main()
Du musst dir allerdings auch noch das super sparen, die Attribute einer Python-Instanz sind in einem einzigen flachen Namensraum abgelegt.
Auch wenn die Frage etwas am Thema vorbei führt stelle ich sie einfach mal, weil sie mir beim Betrachten des Codes gekommen ist und ich im Netz keine passende Antwort gefunden habe.
In diesem Minimalbeispiel ist _x eine Konstante, da sie nie geändert wird. Würde man Konstanten wirklich in der __init__ jedem Objekt zuweisen, oder würde sie global für alle Objekte der Klasse abgelegt werden (können)?
@Zizibee: Konstante auf Klassen sind wie (ungebundene) Methoden auf Klassen: Attribute der Klasse. Also entweder über die Klasse oder in Exemplaren zusätzlich über `self` erreichbar:
Das sind doch zwei voellig orthogonale Konzepte. Das eine bezieht sich darauf welches Publikum deine Eigenschaft hat. Die Allgemeinheit, oder nur "nahe Verwandte". Das andere ist eine semantische Eigenschaft, reine Lesbarkeit.
Da die Basisklasse auch allein eingesetzt werden kann (Event-System) und der betreffende Wert nur über den Konstruktor einmalig zugewiesen wird, denke ich, eine 'read only'-Property ist schon angebracht.
Nein, da hast Du recht. Das meinte ich jetzt auch nicht. Die Property soll nur vor unerlaubten Schreibzugriff schützen, den Wert benötige ich nun mal in der erbenden Klasse.