2010-11-12 16 views
31

Una simple pregunta: ¿cuándo debería usar el término 'clase' y cuándo debería usar el término 'tipo' en Python?Python: terminología 'clase' VS 'tipo'

  • es 'clase' solo para tipos definidos por el usuario, y 'tipo' para tipos incorporados?
  • o ahora que everything is a type ... ¿debo usar siempre 'escribir' incluso para las clases definidas por el usuario?
  • ...?

Respuesta

14

Es más o menos histórico: they used to be different hace mucho tiempo, que ya no tiene implicaciones prácticas.

Editar: utilizo "class" cuando se hace referencia a las implementaciones concretas y "type" de una manera más informal, cuando se habla de estructuras de datos de alto nivel, la aplicación arcitecture etc. En mi pensamiento un tipo es un mayor En general, no pienso en cada clase como un tipo distinto.

Además, cuando uso metaclases (muy raramente) hablo de tipos.

+0

Y usted mismo, ¿cuándo usa uno u otro? – sebpiq

3

Uso "tipo" para referirme al caso general, pero cambio a "clase" cuando hablo de atributos.

Pero realmente no importa cuál elijas.

{} es del tipo dict. El método iteritems() de la clase dict devuelve un iterador.

+0

Ok ... Me estaba preguntando esto, porque es extraño que 1 cosa tenga 2 nombres ... especialmente para un lenguaje muy bueno como Python. – sebpiq

+1

Espere hasta que pulse "constructor" contra "inicializador". –

+3

"constructor" contra "inicializador" no es nada confuso. '__new__' es el constructor y' __init__' es el inicializador. – aaronasterling

0

Se podría decir que un objeto en tiempo de ejecución es de un cierto tipo, pero por medio de la herencia (múltiple) se puede ver como perteneciente a varias clases.

+0

No porque "por medio de herencia múltiple" también es de todos esos tipos. ¿Cuál tipo elegirías para que pertenezca? clase 'is' tipo. – aaronasterling

+0

Me gusta ese aspecto en tiempo de ejecución; cuando se crean nuevos tipos, es una clase y en tiempo de ejecución cuando se creó la clase concreta, es un tipo. – poke

9

A clase es una estructura de datos de Python que se puede usar como plantilla para instancias de esa clase llamándola, p. Ej. foo = Foo().

A tipo es una clase que se puede utilizar como plantilla para clases adicionales a modo de herencia, p. class Foo(Bar):

Dado que Python admite la herencia, todas las clases se pueden usar como plantillas para clases adicionales, lo que significa que todas las clases son de hecho tipos.

Esto es especialmente cierto desde la aparición de las "clases de estilo nuevo" derivadas de object, que unifican la jerarquía de tipos de clases definidas por el usuario con los tipos incorporados. Las clases siempre eran tipos, pero ahora son el mismo tipo de tipos que los tipos incorporados.

Aunque las clases de Python son tipos, todavía encuentro que la distinción es útil, así que los términos no son del todo sinónimos en mi mente.

Definición de bonificación: a metaclass es una clase cuyas instancias son clases.En Python, estos deben derivarse de la clase type, del mismo modo que los objetos de estilo nuevo se derivan de object.

0

Esto podría no responder su pregunta directamente, pero podría darle una idea de la diferencia entre tipo y clase.

class Card: 
    def __init__(self, suit=0, rank=0): 
     self.suit = suit 
     self.rank = rank 
card1 = Card() 

Card es un objeto de la clase, por lo que su tipo es type.

Sin embargo, card1 es una instancia de Card, por lo que su tipo es Card.

+1

... también podría decir "La tarjeta es una instancia de tipo" en lugar de "La tarjeta es un objeto de clase", ¡y volvemos al primer puesto! Todavía no hay necesidad de la palabra "clase";) – sebpiq

Cuestiones relacionadas