¿Constructores múltiples en python?

Posible duplicado:
¿Qué es una forma limpia y pythonica de tener varios constructores en Python?

¿No es posible definir múltiples constructores en Python, con diferentes firmas? Si no es así, ¿cuál es la forma general de evitarlo?

Por ejemplo, digamos que querías definir una clase City

Me gustaría poder decir someCity = City() o someCity = City("Berlin") , donde el primero solo da un valor de nombre predeterminado, y el segundo lo define.

A diferencia de Java, no puedes definir múltiples constructores. Sin embargo, puede definir un valor predeterminado si no se pasa uno.

 def __init__(self, city="Berlin"): self.city = city 

Si sus firmas difieren solo en la cantidad de argumentos que usan argumentos predeterminados, es la forma correcta de hacerlo. Si desea poder pasar en diferentes tipos de argumentos, trataría de evitar el isinstance basado en la isinstance mencionado en otra respuesta, en lugar de utilizar los argumentos de palabras clave. Si usar solo los argumentos de palabras clave se vuelve difícil de manejar, puede combinarlo con los métodos de clase (al código bzrlib le gusta este enfoque). Este es solo un ejemplo tonto, pero espero que tengas 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') 

Tenga en cuenta que todos esos métodos de clase siguen pasando por el mismo __init__ , pero el uso de métodos de clase puede ser mucho más conveniente que tener que recordar qué combinaciones de argumentos de palabras clave funcionan para __init__ .

isinstance mejor manera de evitar esta isinstance es porque la tipificación de pato de Python hace que sea difícil averiguar qué tipo de objeto se pasó realmente. Por ejemplo: si desea tomar un nombre de archivo o un objeto similar a un archivo, no puede usar isinstance(arg, file) porque hay muchos objetos tipo archivo que no hacen subclases (como los que se devuelven desde urllib, StringIO o …). Por lo general, es mejor que la persona que llama le diga explícitamente a qué tipo de objeto se refería, usando diferentes argumentos de palabras clave.

Para el ejemplo que dio, use los valores por defecto:

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

En general, tienes dos opciones:

1) Hacer if – bloques elif basados ​​en el tipo:

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

2) Utilice la escritura de pato, es decir, suponga que el usuario de su clase es lo suficientemente inteligente como para usarlo correctamente. Esta es típicamente la opción preferida.

Jack M. tiene razón, hazlo de esta manera:

 >>> class City: ... def __init__(self, city=None): ... self.city = city ... def __repr__(self): ... if self.city: return self.city ... return '' ... >>> c = City('Berlin') >>> print c Berlin >>> c = City() >>> print c >>> 

La forma más fácil es a través de argumentos de palabras clave:

 class City(): def __init__(self, city=None): pass someCity = City(city="Berlin") 

Esto es algo bastante básico, tal vez mirar los documentos de Python ?