Ich habe eine Klasse mit vielen Instanzvariablen mit Standardwerten, die in instantiantion optional außer Kraft gesetzt werden kann (Anmerkung: keine änderbare Standardargumente).Python: programmatische Klasse Instanz-Variable Initialisierung mit Einheimischen()
Da es ziemlich überflüssig ist self.x = x
usw. oft zu schreiben, initialisiere ich die Variablen programmatisch.
Zur Veranschaulichung betrachten Sie dieses Beispiel (die aus Gründen der Kürze nur 5 Instanzvariablen und alle Methoden weggelassen hat):
Beispiel: So
# The "painful" way
class A:
def __init__(self, a, b=2, c=3, d=4.5, e=5):
self.a = a
self.b = b
self.c = c
self.d = d
self.e = e
# The "lazy" way
class B:
def __init__(self, a, b=2, c=3, d=4.5, e=5):
self.__dict__.update({k: v for k, v in locals().items() if k!='self'})
# The "better lazy" way suggested
class C:
def __init__(self, a, b=2, c=3, d=4.5, e=5):
for k, v in locals().items():
if k != 'self':
setattr(self, k, v)
x = A(1, c=7)
y = B(1, c=7)
z = C(1, c=7)
print(x.__dict__) # {'d': 4.5, 'c': 7, 'a': 1, 'b': 2, 'e': 5}
print(y.__dict__) # {'d': 4.5, 'c': 7, 'a': 1, 'b': 2, 'e': 5}
print(z.__dict__) # {'d': 4.5, 'c': 7, 'a': 1, 'b': 2, 'e': 5}
zu machen mein Leben einfacher, verwende ich das Idiom in der Klasse B gezeigt, die das gleiche Ergebnis wie A.
Ist die schlechte Praxis ergibt? Gibt es irgendwelche Fallstricke?
Nachtrag: Ein weiterer Grund, dieses Idiom zu verwenden war, um Platz zu sparen - ich habe es in MicroPython verwenden soll. Aus welchen Gründen auch immerBecause locals work differently there arbeitet nur der Weg, der in Klasse A gezeigt wird.
Ja. Es ist eine schlechte Übung. Warum nicht ein 'dict()' verwenden? Müssen sie Klassenattribute sein? –
Related: http://stackoverflow.com/q/1389180/3001761. – jonrsharpe
Ich kann mir keine offensichtlichen Fallstricke vorstellen, aber ich finde es ziemlich eklig. – wim