Ich bin nicht einverstanden, dass dies nützlich. Ich finde, dass zwingt Entwickler (einschließlich mir) zwingen, die schmerzhafte BoilerPlate der Member Variable Initiation ist eine gute Möglichkeit, Menschen davon abzuhalten, __init__
Methoden, die eine lächerliche Anzahl von Argumenten akzeptieren, die in eine lächerliche Anzahl von Member-Variablen umgewandelt werden.
Dies passiert häufig, wenn jemand die in einer Klasse verfügbaren Features durch zusätzliche Argumente, Feature-Flags und boolesche Switch-Variablen erweitern möchte, die die benutzerdefinierte Instanziierung steuern. Ich betrachte alle diese als unzulängliche Wege, um mit der Notwendigkeit fertig zu werden, neue oder optionale erweiterte Komplexität zu berücksichtigen.
Wenn man diese besondere Art von Boilerplate eingeben muss, ist das eine Art Steuer auf Klassenblähungen. Wenn Sie so viele Argumente in __init__
akzeptieren, dass Sie diese Funktion benötigen, ist es normalerweise ein guter Indikator, dass Sie Ihr Design mit kleineren, unterteilten Klassen, vielleicht einem MixIn Design, umgestalten sollten.
Dennoch ist hier eine Möglichkeit, es ohne die Fehlleitung des Dekorators zu tun. Ich habe keinen Versuch unternommen, mit *args
umzugehen, aber dann müssten Sie in diesem speziellen Fall eine spezielle Logik dafür definieren, welche unbenannten Positionsargumente ohnehin gemeint sind.
def init_from_map(obj, map):
for k,v in map.iteritems():
if k not in ["self", "kwargs"]:
setattr(obj, k, v)
elif k == "kwargs":
for kk, vv in v.iteritems():
setattr(obj, kk, vv)
class Foo(object):
def __init__(self, x, y, **kwargs):
init_from_map(self, locals())
f = Foo(1, 2, z=3)
print f.x, f.y, f.z
print f.__dict__
Drucke:
1 2 3
{'x': 1, 'y': 2, 'z': 3}
Dies scheint, wie es solch ein nützliches Werkzeug sein, könnte ich mir vorstellen, dass es einige 3rd-Party-Bibliothek auf PyPI, die diese Funktionalität zur Verfügung stellt. – SethMMorton
Python-Version? –
@SethMMorton Ich stimme nicht zu, dass dies nützlich ist. Ich finde, dass das Zwingen von Entwicklern (einschließlich mir), das schmerzhafte Boilerplate der Membervariableninitiation zu tippen, eine gute Möglichkeit ist, Leute davon abzuhalten, "__init__" -Methoden zu haben, die eine lächerliche Anzahl von Argumenten akzeptieren, die in eine lächerliche Anzahl von Mitgliedsvariablen umgewandelt werden . Es ist wie eine Steuer auf Klassenblähung. Wenn Sie so viele Argumente in "__init__" akzeptieren, dass Sie diese Funktion benötigen, ist es normalerweise ein guter Hinweis darauf, dass Sie Ihr Design mit kleineren, unterteilten Klassen, vielleicht einem MixIn-Design, umgestalten sollten. – ely