441 Stimmen

Wie kann man die __init__-Methode anhand des Argumenttyps überladen?

Nehmen wir an, ich habe eine Klasse, die ein Mitglied namens data hat, das eine Liste ist.

Ich möchte die Klasse z. B. mit einem Dateinamen (der Daten zur Initialisierung der Liste enthält) oder mit einer tatsächlichen Liste initialisieren können.

Wie gehen Sie dabei vor?

Prüfen Sie den Typ einfach anhand der __class__ ?

Gibt es einen Trick, den ich übersehen habe?

Ich bin an C++ gewöhnt, wo das Überladen nach Argumenttyp einfach ist.

4voto

Moe Punkte 26523

Sie sollten isinstance verwenden

isinstance(...)
    isinstance(object, class-or-type-or-tuple) -> bool

    Return whether an object is an instance of a class or of a subclass thereof.
    With a type as second argument, return whether that is the object's type.
    The form using a tuple, isinstance(x, (A, B, ...)), is a shortcut for
    isinstance(x, A) or isinstance(x, B) or ... (etc.).

2voto

Eli Courtwright Punkte 174547

Sie wollen wahrscheinlich die isinstance eingebauten Funktion:

self.data = data if isinstance(data, list) else self.parse(data)

0voto

Baltimark Punkte 8606

OK, gut. Ich habe dieses Beispiel nur mit einem Tupel und nicht mit einem Dateinamen zusammengewürfelt, aber das ist einfach. Vielen Dank an alle.

class MyData:
    def __init__(self, data):
        self.myList = []
        if isinstance(data, tuple):
            for i in data:
                self.myList.append(i)
        else:
            self.myList = data

    def GetData(self):
        print self.myList

a = [1,2]

b = (2,3)

c = MeineDaten(a)

d = MeineDaten(b)

c.GetData()

d.GetData()

[1, 2]

[2, 3]

0voto

Fydo Punkte 1360

Meine bevorzugte Lösung ist:

class MyClass:
    _data = []
    __init__(self,data=None):
        # do init stuff
        if not data: return
        self._data = list(data) # list() copies the list, instead of pointing to it.

Rufen Sie es dann entweder mit MyClass() o MyClass([1,2,3]) .

Ich hoffe, das hilft. Viel Spaß beim Codieren!

-2voto

ankostis Punkte 7409

Warum werden Sie nicht noch pythonischer?

class AutoList:
def __init__(self, inp):
    try:                        ## Assume an opened-file...
        self.data = inp.read()
    except AttributeError:
        try:                    ## Assume an existent filename...
            with open(inp, 'r') as fd:
                self.data = fd.read()
        except:
            self.data = inp     ## Who cares what that might be?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X