2011-05-25 17 views
13

Duplicar posible:
Python (and Python C API): new versus init¿Cuál es la diferencia entre un constructor y el inicializador en python?

estoy en la universidad en este momento y el profesor estaba usando los constructores términos y inicializadores de manera intercambiable. Sin embargo, estoy bastante seguro de que esto está mal.

He intentado buscar en Google la respuesta pero no he encontrado la respuesta que estoy buscando.

+0

Creo que alguien olvidó el botón "duplicar exactamente" al cerrar y presionó "fuera del tema" en su lugar .... :) –

Respuesta

19

En la mayoría de los lenguajes OO, son el mismo paso, por lo que no está equivocado para cosas como java, C++, etc. En python se hacen en dos pasos: __new__ es el constructor; __init__ es el inicializador.

Here es otra respuesta que entra en más detalles sobre las diferencias entre ellos.

+0

mejor respuesta sobre este tema que he visto en mi vida. – user2372074

0

http://docs.python.org/reference/datamodel.html#basic-customization

__new__ - constructor.

__init__ - inicializador.

+1

-1 Esa página a la que se vinculó describe '__init__' como un constructor, mientras que hace referencia tanto a' __init__' como a '__new__' recibiendo los argumentos pasados ​​a ** la expresión del constructor **. En ninguna parte menciona la palabra "inicializador". – Ben

5

En casi todos los casos habituales, Python no tiene constructores en el mismo sentido utilizado por otros lenguajes de OO, ya que la memoria de administración manual generalmente se desaconseja. En cambio, lo que normalmente debería hacer es definir un método __ init __ en la clase. Este método se llama para inicializar el nuevo objeto de instancia automáticamente, lo primero después de que se construye. Por lo tanto, no es realmente un constructor, y hablar de ello como un constructor podría confundir a algunas personas.

Por supuesto, algunas personas quieren llamarlo un constructor porque se usa un poco como un constructor; fundamentalmente, puede llamarlo como quiera siempre que todos entiendan a qué se refiere en realidad. Pero, en general, para ser explícito y hacerse entender, llámelo un método init o algo que no sea un constructor. Fundamentalmente, los diferentes idiomas vienen con terminología algo diferente y hablar muy claramente siempre requerirá un ajuste a su tema y audiencia.

En Python es posible administrar la creación y destrucción de instancias en una granularidad más fina, aunque no querrás hacerlo a menos que sepas lo que estás haciendo. Esto se hace mediante la definición de __ __ nueva y __ __ del métodos para enganchar instancias de objetos y Del declaraciones. Si estos califican como constructores y destructores es un poco más debatible (Python llama al destructor del método un destructor, pero tiende a ser más vago en lo que constituye un constructor, por ejemplo, incluye muchas funciones que devuelven instancias de objetos). Todavía te animo a que uses la terminología específica para el idioma en cuestión, y en discusiones comparativas para definir tus términos por adelantado. Como siempre, la elección de los términos al hablar involucra intercambios entre el público que puede seguirte fácilmente y el público potencialmente puede ser confundido: si hablas de manejo de memoria probablemente sea lo más específico posible, pero si estás hablando libremente, entonces solo use algunas palabras que su audiencia entienda y esté listo para aclarar.

Su instructor no está claro en el peor de los casos, no conozco ninguna definición canónica de estos términos, pero pueden confundir a las personas que han aprendido definiciones muy específicas de otros idiomas.

Cuestiones relacionadas