So habe ich einigen Gott verlassen Legacy-Code, der das reservierte Wort falsch property
, um verwendet. In einer Basisklasse, die vererbt wird, wurden sie grundsätzlich implementiert.Missbrauch von Eigentum reservierten Wort
class TestClass(object):
def __init__(self, property):
self._property = property
@property
def property(self):
return self._property
test = TestClass('test property')
print(test.property)
Welche läuft ohne Fehler. Wenn Sie eine andere Methode, die unten hinzufügen, dass Sie erhalten,
class TestClass2(object):
def __init__(self, property):
self._property = property
@property
def property(self):
return self._property
@property
def other_property(self):
return 'test other property'
test = TestClass2('test property')
print(test.property)
print(test.other_property)
Welche wirft:
---> 10 @property
11 def other_property(self):
12 print('test other property')
TypeError: 'property' object is not callable
Weil Sie wissen, dass Sie property
im lokalen Namespace überschrieben haben.
class TestClass3(object):
def __init__(self, property):
self._property = property
@property
def other_property(self):
return 'test other property'
@property
def property(self):
return self._property
test = TestClass3('test property')
print(test.property)
print(test.other_property)
Sie können dieses Problem umgehen, wenn Sie immer Ihre property
Überschreiben am Ende der Klasse definieren. Wenn die property
-Methode nur für die Basisklasse definiert ist, die Sie von Dingen erben, funktioniert das auch, weil Namespaces.
class TestClass4(TestClass):
def __init__(self, property):
super(TestClass4, self).__init__(property)
@property
def other_property(self):
return 'test other property'
test = TestClass4('test property')
print(test.property)
print(test.other_property)
Meine Entrüstung sagt, dass wir diese Variablennamen in der riesigen Menge von Legacy-Code aktualisieren muss, weil GAAAAH, aber anders als neue Methoden zu erinnern, die über der Definition von property
Definition in der selten modifizierte Base hinzufügen Klasse, das bricht eigentlich nichts richtig?
downvoter Grund? Ich bin ok mit einem Downvote, aber ich bin neugierig, warum? –
Es gibt viele Gründe, Eigentum zu verwenden. Es ist ziemlich pythonisch, Ihre API über Attribute anstatt über Zugriffsmethoden und Mutatoren zu offenbaren, aber das würde bedeuten, dass Sie Werte nicht träge berechnen können oder Nebenwirkungen haben, wenn Leute Werte setzen. 'Eigenschaft' ermöglicht es Ihnen, das Beste aus beiden Welten zu haben. –
es gibt keine privaten Variablen in Python ... und alles, was ich sagte, war eine Meinung, ich halte ihn sicherlich nicht davon ab, Eigentum zu verwenden ... meine Meinung ist ziemlich irrelevant zu meiner Antwort, die die richtige Antwort auf die Frage ist. –