Si vos signatures ne diffèrent que par le numéro d'arguments, l'utilisation d'arguments par défaut est la bonne façon de procéder. Si vous voulez être en mesure de passer dans différents types d'argument, j'essaierais d'éviter le isinstance
mentionné dans une autre réponse, et utiliser à la place des arguments par mots-clés.
Si l'utilisation des arguments par mot-clé devient difficile, vous pouvez les combiner avec des classmethods (le code de bzrlib aime cette approche). Ce n'est qu'un exemple stupide, mais j'espère que vous avez compris l'idée :
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')
Remarquez que toutes ces méthodes de classe passent toujours par le même __init__
mais l'utilisation de classmethods peut s'avérer beaucoup plus pratique que de devoir se souvenir des combinaisons d'arguments de mot-clé pour __init__
travail.
isinstance
est à éviter, car le typage en canard de Python rend difficile la détermination du type d'objet réellement transmis. Par exemple, si vous voulez prendre un nom de fichier ou un objet de type fichier, vous ne pouvez pas utiliser la commande isinstance(arg, file)
parce qu'il existe de nombreux objets de type fichier qui ne sous-classent pas file
(comme ceux retournés par urllib, ou StringIO, ou...). Il est généralement préférable que l'appelant vous dise explicitement quel type d'objet était visé, en utilisant des arguments de mots-clés différents.
2 votes
Cela me fait penser à cette question - stackoverflow.com/questions/682504/
1 votes
Le meilleur : Comment surcharger
__init__
en fonction du type d'argument ?1 votes
Cette question est trompeuse en raison de la relation entre le titre et le corps du texte. Pire, elle semble être la réponse la plus fréquente sur Google ; j'aimerais qu'elle soit modifiée ou supprimée, car la question posée dans le corps du texte est vraiment élémentaire. Les réponses au titre peuvent être trouvées dans l'éventuel lien dupliqué.