Jeśli podpisy różnią się jedynie liczby argumentów wykorzystaniem domyślnych argumentów jest właściwy sposób to zrobić. Jeśli chcesz móc przekazywać różne argumenty w postaci , spróbuję uniknąć podejścia opartego na isinstance
wspomnianego w innej odpowiedzi, zamiast używać argumentów słów kluczowych. Jeśli użycie argumentów tylko słów kluczowych staje się nieporęczne, możesz połączyć je z metodami klasy (kod bzrlib lubi to podejście). To jest po prostu głupi przykład, ale mam nadzieję, że masz pomysł:
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')
uwaga Wszystkie te classmethods jeszcze przejść przez ten sam __init__
, ale przy użyciu classmethods może być znacznie wygodniejsze niż konieczności pamiętania co kombinacje argumentów kluczowych do pracy __init__
.
Najlepiej unikać, ponieważ pisanie kaczych pysków sprawia, że trudno jest określić, jaki obiekt został faktycznie przekazany. Na przykład: jeśli chcesz wziąć nazwę pliku lub obiektu podobnego do pliku, nie możesz użyć isinstance(arg, file)
, ponieważ istnieje jest wiele obiektów podobnych do plików, które nie mają podklasy file
(jak te zwrócone z urllib lub StringIO, lub ...). Zazwyczaj lepszym rozwiązaniem jest, aby osoba dzwoniąca wyraźnie informowała cię, jaki rodzaj obiektu miał na myśli, używając różnych argumentów słów kluczowych.
każ mi myśleć o tym mowa - http://stackoverflow.com/questions/682504/what-is-a-clean-pythonic-way-to-have-multiple -konstruktorów-w-pythonach – Gant
Najlepsze: [Jak przeciążyć metodę '__init__' opartą na typie argumentu?] (https://stackoverflow.com/questions/141545/how-to-overload-init-method-based-on- argument-type) –