Clase con objeto como parámetro

114

Estoy tratando de traducir algo de código Python al código Scala. Así que soy un novato total en Python.

Pero, ¿por qué algunas clases tienen objeto como parámetro pero nunca lo usan explícitamente? ¿Cuál es el motivo para tenerlo como parámetro en primer lugar?

Ejemplo:

class Table(object)

Gracias por tu tiempo.

programador mítico
fuente
1
posible duplicado de clases de estilo antiguo y nuevo en Python
JBernardo

Respuestas:

112

En Python2, esto declara Tableser una clase de nuevo estilo (a diferencia de la clase "clásica"). En Python3 todas las clases son clases de estilo nuevo, por lo que esto ya no es necesario.

Las clases de estilo nuevo tienen algunos atributos especiales de los que carecen las clases clásicas.

class Classic: pass
class NewStyle(object): pass

print(dir(Classic))
# ['__doc__', '__module__']

print(dir(NewStyle))
# ['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']

Además, las propiedades y super no funcionan con clases clásicas.

En Python2 es una buena idea hacer que todas las clases sean clases de estilo nuevo. (Aunque muchas clases en la biblioteca estándar siguen siendo clases clásicas, en aras de la compatibilidad con versiones anteriores).

En general, en una declaración como

class Foo(Base1, Base2):

Foose declara como una clase heredada de las clases base Base1y Base2.

objectes la madre de todas las clases en Python. Es una clase de estilo nuevo, por lo que heredar de objecthace Tableuna clase de estilo nuevo.

unutbu
fuente
¿Puede redirigirme a una fuente que mencione que el objeto no es necesario como parámetro en Python3? No creo poder encontrarlo. Gracias
Nieve
1
Se ha mencionado muchas veces en StackOverflow ( aquí, por ejemplo ), pero no he podido encontrar una declaración simple de esto en los documentos. Se muestra implícitamente (por la omisión de objectde la lista de bases de clases) en el tutorial .
unutbu
1
Los documentos de Python3 también establecen que una "clase de nuevo estilo" es el "nombre antiguo para el sabor de las clases que ahora se usan para todos los objetos de clase " (énfasis mío). Y los documentos de Python2 establecen que una "clase de nuevo estilo" es cualquier clase que hereda object. Las dos declaraciones juntas implican que no es necesario incluirlas objecten la lista de bases de clases en Python3 ya que todas las clases son clases de estilo nuevo en Python3.
unutbu
21

La Tableclase está ampliando una clase llamada object. No es un argumento. La razón por la que puede querer ampliar objectexplícitamente es que convierte la clase en una clase de nuevo estilo. Si no especifica explícitamente que se extiende object, hasta Python 3, se convertirá de forma predeterminada en una clase de estilo antiguo. (Desde Python 3, todas las clases son de estilo nuevo, ya sea que las extienda explícitamente objecto no).

Para obtener más información sobre las clases de estilo nuevo y antiguo, consulte esta pregunta .

icktoofay
fuente
1
Esta es la respuesta más sencilla y concisa. Gracias.
Sabuncu
3

Solo tenga en cuenta que la distinción de clase "estilo nuevo" frente a "estilo antiguo" es específica de Python 2.x; en 3.x, todas las clases son de "estilo nuevo".

Lawrence D'Oliveiro
fuente
2

class Table y class Table (objeto) no son diferentes para Python.

No es un parámetro, se extiende desde el objeto (que es la clase base como muchos otros lenguajes).

Todo lo que dice es que hereda lo que esté definido en "objeto". Este es el comportamiento estándar.

Devraj
fuente
3
Las clases que se extienden automáticamente objectes el comportamiento predeterminado solo en Python 3. En python 2, un objeto de extensión de clase tiene atributos que no tendrá una clase que no extienda el objeto.
Lewis Ellis
1

object es el tipo más básico de objeto de clase definido en python. Los atributos del objeto se pueden ver a continuación

** >>> dir (objeto)

[' class ', ' delattr ', ' doc ', ' format ', ' getattribute ', ' hash ', ' init ', ' new ', ' reduce ', ' reduce_ex ', ' repr ', ' setattr ', ' sizeof ',' str ',' subclasshook '] **

Entonces, Table (objeto) es solo herencia.!

Anilkumar Mallakkanavar
fuente
0

1) Nombre de la clase (objeto): 2) Nombre de la clase: Ambos son iguales pero primero uno bastante mejor en términos de escritura, se ve mejor mientras hereda otras clases a otra, se ve homogéneo.

¿Qué igual? Entonces, todo en Python está incluido en el objeto, significa que todo en Python tiene propiedad de objeto, si escribe o no, lo entenderá. En primer lugar lo decimos explícitamente y en segundo no lo hicimos.


fuente
Este no es el caso en Python 2, consulte la respuesta aceptada para obtener más detalles.
niemmi