Ich versuche herauszufinden, die beste Möglichkeit, Sub/Superklassen in Python3 zu initialisieren. Sowohl die Basis als auch die Unterklassen benötigen ein halbes Dutzend Parameter, die alle von Befehlszeilenargumenten analysiert werden.Best Practices für die Übergabe von Initialisierungsargumenten an Superklassen?
Der offensichtliche Weg, dies zu implementieren ist auf einmal alle Argumente zu analysieren, und übergeben sie alle in:
class Base:
def __init__(self, base_arg1, base_arg2, base_arg3):
class Sub(Base):
def __init__(self, sub_arg1, sub_arg2, sub_arg3,
base_arg1, base_arg2, base_arg3):
super().__init__(self, base_arg1, base_arg2, base_arg3)
main():
# parse args here
options = parser.parse_args()
obj = Sub(options.sub_arg1, options.sub_arg2, options.sub_arg3,
options.base_arg1, options.base_arg2, options.base_arg3)
Wenn ich eine Sub-Unterklasse haben (was ich will), die Dinge wirklich haarig in Begriffe der Liste von Argumenten, die durch sukzessive super() weitergegeben werden. init() Anrufe.
Aber es fällt mir ein, dass argparse.parse_known_args() einen anderen Weg bietet: ich jede Unterklasse, die Argumente analysieren, haben könnte, es braucht/erkennt und den Rest der Argumente auf die Hierarchie übergeben:
class Base:
def __init__(self, args):
base_options = base_parser.parse_known_args(args)
class Sub(Base):
def __init__(self, args):
(sub_options, other_args) = sub_parser.parse_known_args(args)
super().__init__(self, other_args)
main():
obj = Sub(sys.argv)
Dies scheint aus API-Sicht sauberer zu sein. Aber ich kann mir vorstellen, dass es gegen einige Grundsätze der Art, wie Dinge in Python getan werden, verstößt und aus allen möglichen Gründen eine schlechte Idee ist. Meine Suche im Internet hat keine Beispiele gezeigt - könnte der mächtige und allwissende Verstand von Stack Overflow mir helfen, den richtigen Weg zu verstehen, dies zu tun?