Si sus firmas sólo se diferencian en el número de los argumentos que utilizan los argumentos por defecto es la forma correcta de hacerlo. Si desea poder pasar diferentes tipos de del argumento, trataría de evitar el enfoque basado en isinstance
mencionado en otra respuesta, en lugar de usar argumentos de palabra clave. Si el uso de solo argumentos de palabra clave se vuelve difícil de manejar, puede combinarlo con classmethods (al código bzrlib le gusta este enfoque). Esto es sólo un ejemplo tonto, pero espero que la idea:
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')
Aviso todas esas classmethods siguen pasando por la misma __init__
, pero utilizando classmethods pueden ser mucho más cómodo que tener que recordar qué combinaciones de argumentos de palabra clave a __init__
trabajo.
isinstance
es mejor evitarlo porque la tipificación de pato del pitón hace que sea difícil averiguar qué tipo de objeto se pasa realmente en. Por ejemplo: si usted quiere tomar ya sea un nombre de archivo o un objeto de tipo fichero que no se puede utilizar isinstance(arg, file)
porque hay hay muchos objetos similares a archivos que no incluyen la subclase file
(como los devueltos desde urllib, o StringIO, o ...). Por lo general, es una mejor idea que la persona que llama le diga explícitamente qué tipo de objeto significa, utilizando diferentes argumentos de palabras clave.
me hacen pensar en esta pregunta - http://stackoverflow.com/questions/682504/what-is-a-clean-pythonic-way-to-have-multiple -constructors-in-python – Gant
Mejor: [¿Cómo sobrecargar el método '__init__' basado en el tipo de argumento?] (https://stackoverflow.com/questions/141545/how-to-overload-init-method-based-on- argumento-tipo) –