Ich bin etwas neu in OOP in Python (und Python im Allgemeinen), und ich stehe auf ein Problem, wenn ich versuche, auf eine private Instanz von Instanzen innerhalb von einem zuzugreifen der Methoden und Verwendung einer Zeichenfolge als Eigenschaftsname.Aufrufen einer privaten Eigenschaft einer Python-Instanz mit einer Zeichenfolge
Das Ziel hier ist im Grunde eine Liste von Eigenschaften, die angezeigt werden (in einem Schlüssel - Wert Format), wenn die Objekte getDetails() -Methode aufgerufen wird. Und es funktioniert gut, solange alle Eigenschaften in der Liste keine privaten Eigenschaften im Objekt sind. Wenn alle Eigenschaften nicht privat sind, dann scheint es gut zu funktionieren.
Im folgenden Beispiel können Sie sehen, ich habe 3 Eigenschaften, foo
, _bar
und __baz
. Im TheClass.getDetails()
Verfahren, wenn die __baz
Line-Out wird kommentiert, funktioniert es völlig in Ordnung:
class TheClass(object):
def __init__(self):
self.foo = 'One..'
self._bar = 'Two..'
self.__baz = 'Three..'
def getDetails(self):
display = [
'foo'
,'_bar'
#,'__baz'
]
print "DebugInfo:"
for key in display:
print '{0:<15}: {1:<20}'.format(key, self.__dict__[ key ] or 'N/A')
TheClass().getDetails()
""" Output:
DebugInfo:
foo : One..
_bar : Two..
"""
Allerdings, wenn ich den __baz
Eintrag in dem display
Array Kommentar-, ich eine Ausnahme erhalten geworfen:
DebugInfo:
foo : One..
_bar : Two..
Traceback (most recent call last):
File "getattr.py", line 18, in <module>
TheClass().getDetails()
File "getattr.py", line 16, in getDetails
print '{0:<15}: {1:<20}'.format(key, self.__dict__[ key ] or 'N/A')
KeyError: '__baz'
Ich habe versucht, zu ändern, wie die Eigenschaft referenziert wurde, die self.__dict__[ key ]
mit getattr(self, key)
, aber das hat nur zu dem gleichen Fehler geführt:
DebugInfo:
foo : One..
_bar : Two..
Traceback (most recent call last):
File "getattr.py", line 18, in <module>
TheClass().getDetails()
File "getattr.py", line 16, in getDetails
print '{0:<15}: {1:<20}'.format(key, getattr(self, key) or 'N/A')
AttributeError: 'TheClass' object has no attribute '__baz'
Wenn ich nur die Eigenschaften codieren, dann arbeiten, dass offensichtlich gut:
class TheClass(object):
def __init__(self):
self.foo = 'One..'
self._bar = 'Two..'
self.__baz = 'Three..'
def getDetails(self):
print "DebugInfo:"
print '{0:<15}: {1:<20}'.format('foo', self.foo or 'N/A')
print '{0:<15}: {1:<20}'.format('_bar', self._bar or 'N/A')
print '{0:<15}: {1:<20}'.format('__baz', self.__baz or 'N/A')
TheClass().getDetails()
""" Output:
DebugInfo:
foo : One..
_bar : Two..
__baz : Three..
"""
Aber ich brauche das ein bisschen mehr Dynamik. Also weiß jemand, ob ein Weg, um das zu funktionieren?
Danke!
P.S. Ich verwende Python 2.7.11