He encontrado que ambos de los siguientes trabajos:
class Foo():
def a(self):
print "hello"
class Foo(object):
def a(self):
print "hello"
¿Deberían todas las clases de Python extender el objeto? ¿Hay algún problema potencial con no extender el objeto?
python
inheritance
Kara
fuente
fuente
class Foo():
yclass Foo:
? Como observo, ambos trabajan en Python 3.Respuestas:
En Python 2, no heredar de
object
creará una clase de estilo antiguo, que, entre otros efectos, causatype
resultados diferentes:vs.
Además, las reglas para la herencia múltiple son diferentes en formas que ni siquiera intentaré resumir aquí. Toda la buena documentación que he visto sobre MI describe clases de estilo nuevo.
Finalmente, las clases de estilo antiguo han desaparecido en Python 3, y la herencia se
object
ha vuelto implícita. Por lo tanto, siempre prefiera nuevas clases de estilo a menos que necesite compatibilidad con software antiguo.fuente
En Python 3, las clases se extienden
object
implícitamente, lo diga usted mismo o no.En Python 2, hay clases de estilo antiguo y nuevo . Para indicar que una clase es de estilo nuevo, debe heredar explícitamente de
object
. Si no, se usa la implementación de estilo antiguo.Generalmente quieres una clase de nuevo estilo. Heredar de
object
explícitamente. Tenga en cuenta que esto también se aplica al código de Python 3 que pretende ser compatible con Python 2.fuente
En python 3 puede crear una clase de tres maneras diferentes e internamente todas son iguales (ver ejemplos). No importa cómo cree una clase, todas las clases en Python 3 heredan de una clase especial llamada objeto . El objeto de clase es una clase fundamental en python y proporciona mucha funcionalidad como métodos de doble subrayado, descriptores, método super (), método de propiedad (), etc.
Ejemplo 1.
Ejemplo 2
Ejemplo 3
fuente
object
hace referencia a la función integradaobject
. Si debemos tener en cuenta que cualquier identificador incorporado de CPython puede ser reemplazado, apenas podríamos hacer alguna afirmación sobre el modelo de datos. ¿Se puede argumentar seriamente questr
no siempre se acepta una cadena como argumento porque se podría asignarbuiltins.str = None
?Sí, todas las clases de Python deberían extender el objeto (o más bien la subclase, aquí está Python). Si bien normalmente no se producirán problemas graves, en algunos casos (como con múltiples árboles de herencia) esto será importante. Esto también garantiza una mejor compatibilidad con Python 3.
fuente
Como han cubierto otras respuestas, la herencia de Python 3 del objeto está implícita. Pero no indican lo que debe hacer y qué es la convención.
Todos los ejemplos de documentación de Python 3 usan el siguiente estilo que es convencional, por lo que le sugiero que siga esto para cualquier código futuro en Python 3.
Fuente: https://docs.python.org/3/tutorial/classes.html#class-objects
Cita de ejemplo:
Otra cita:
fuente
en python3 no hay diferencia, pero en python2 no extender
object
le da una clase de estilo antiguo; le gustaría usar una clase de estilo nuevo sobre una clase de estilo antiguo.fuente