Mehrere Konstruktoren in Python?



Answers

Wenn sich Ihre Signaturen nur in der Anzahl der Argumente unterscheiden, die Standardargumente verwenden, ist dies der richtige Weg. Wenn Sie in der Lage sein wollen, verschiedene Arten von Argumenten zu übergeben, würde ich versuchen, den in einer anderen Antwort erwähnten Ansatz zu vermeiden, stattdessen Schlüsselwortargumente zu verwenden. Wenn nur Schlüsselwort-Argumente unhandlich werden, können Sie es mit Klassenmethoden kombinieren (der bzrlib-Code mag diesen Ansatz). Dies ist nur ein dummes Beispiel, aber ich hoffe, Sie bekommen die Idee:

class C(object):

    def __init__(self, fd):
        # Assume fd is a file-like object.
        self.fd = fd

    @classmethod
    def fromfilename(cls, name):
        return cls(open(name, 'rb'))

# Now you can do:
c = C(fd)
# or:
c = C.fromfilename('a filename')

Beachten Sie, dass alle Klassenmethoden immer noch denselben __init__ , aber die Verwendung von Klassenmethoden kann viel praktischer sein, als sich daran erinnern zu müssen, welche Kombinationen von Schlüsselwortargumenten zu __init__ funktionieren.

isinstance wird am besten vermieden, weil es schwierig ist, herauszufinden, welche Art von Objekt tatsächlich übergeben wurde. Wenn Sie beispielsweise einen Dateinamen oder ein dateiähnliches Objekt verwenden isinstance(arg, file) können Sie isinstance(arg, file) nicht verwenden Es gibt viele dateiähnliche Objekte, die keine file ableiten (wie die von urllib, StringIO oder ...). Es ist normalerweise eine bessere Idee, wenn der Anrufer Ihnen explizit mitteilt, welche Art von Objekt gemeint ist, indem Sie verschiedene Schlüsselwortargumente verwenden.

Question

Mögliche Duplikate:
Was ist eine saubere, pythische Möglichkeit, mehrere Konstruktoren in Python zu haben?

Ist es nicht möglich, mehrere Konstruktoren in Python mit unterschiedlichen Signaturen zu definieren? Wenn nicht, um welche Art und Weise geht es herum?

Angenommen, Sie möchten eine Klasse " City definieren

Ich würde gerne someCity = City() oder someCity = City("Berlin") sagen someCity = City() , wobei der erste nur einen Standardnamenwert someCity = City("Berlin") und der zweite ihn definiert.




Verwenden Sie für das von Ihnen angegebene Beispiel Standardwerte:

class City:
    def __init__(self, name="Default City Name"):
        ...
    ...

In der Regel haben Sie zwei Möglichkeiten:

1) Tun if - elif Blöcke basierend auf dem Typ:

def __init__(self, name):
    if isinstance(name, str):
        ...
    elif isinstance(name, City):
        ...
    ...

2) Benutze die Duck-Eingabe --- dh, der Benutzer deiner Klasse ist intelligent genug, um ihn richtig zu benutzen. Dies ist normalerweise die bevorzugte Option.




Links