Zugang statische Klassenvariablen der übergeordneten Klasse in Python
-
28-09-2019 - |
Frage
Ich habe wie diese some
class A:
__a = 0
def __init__(self):
A.__a = A.__a + 1
def a(self):
return A.__a
class B(A):
def __init__(self):
# how can I access / modify A.__a here?
A.__a = A.__a + 1 # does not work
def a(self):
return A.__a
Kann ich auf die __a
Klassenvariable in B
? Es ist möglich, schriftlich a
statt __a
, ist dies der einzige Weg? (Ich denke, die Antwort könnte eher kurz sein: ja:)
Lösung
So ist __a
keine statisch Variable, es ist eine Klassenvariable. Und wegen der doppelten Unterstrich, es ist ein Namen Variable verstümmelt. Das heißt, um es Pseudo-private, wird es automatisch umbenannt statt _<classname>__<variablename>
__<variablename>
. Es kann immer noch durch Instanzen von zugegriffen wird, dass die Klasse nur als __<variablename>
, Subklassen nicht bekommen, diese spezielle Behandlung.
Ich würde empfehlen, dass Sie den doppelten Unterstrich nicht verwenden, nur einen einzigen Unterstrich (a) markiert, dass es privat ist, und (b) die Namen Mangeln zu vermeiden.
Andere Tipps
Siehe es als A._A__a
. In Python, Symbole mit einem __
Präfix innerhalb einer Klassendefinition vorkommen _<class-name>
Präfix sie etwas " private ". Somit ist die Referenz A.__a
, das erscheint in der Definition von B
ist, counterintuitively, ein Verweis auf A._B__a
:
>>> class Foo(object): _Bar__a = 42
...
>>> class Bar(object): a = Foo.__a
...
>>> Bar.a
42
Es gibt Python Dekorateure @staticmethod
und @classmethod
, die Sie verwenden können, eine Methode statisch oder klassenbezogenen zu erklären. Dies sollte Ihr Klassendatenelement hilft Zugriff:
class MyClass:
__a = 0
@staticmethod
def getA():
return MyClass.__a
class MyOtherClass:
def DoSomething(self):
print MyClass.getA() + 1
Beispiel von dieser Quelle inspiriert: http://www.rexx.com/~dkuhlman/python_101/python_101.html