2011-09-11 21 views
63

Estoy tratando de traducir un código python al código scala. Entonces soy un novato total en Python.Clase con objeto como parámetro

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

Ejemplo:

class Table(object) 

Gracias por su tiempo.

+0

posible duplicado de [Estilo antiguo y nuevas clases de estilo en Python] (http://stackoverflow.com/questions/54867/old-style-and-new-style-classes-in-python) – JBernardo

Respuesta

68

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

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

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, properties y super no funcionan con las clases clásicas.

En Python2 es una buena idea hacer todas las clases de estilo nuevo. (Aunque una gran cantidad de clases en la biblioteca estándar siguen siendo las clases clásicas, por el bien de la compatibilidad hacia atrás.)

En general, en una declaración como

class Foo(Base1, Base2): 

Foo se declara como una clase heredando de las clases base Base1 y Base2.

object es la madre de todas las clases en Python. Es una clase de nuevo estilo, por lo que heredar de object hace que Table sea una clase de nuevo estilo.

+0

¿me puede redirigir a una fuente que mencione el objeto no es necesario como parámetro en Python3? No creo poder encontrarlo. Gracias –

+1

Se ha mencionado muchas veces en StackOverflow ([aquí, por ejemplo] (https://stackoverflow.com/a/16193572/190597)), pero no he podido encontrar una declaración simple de esto en el docs. Se muestra implícitamente (por la omisión de 'object' de la lista de bases de clases) [en el tutorial] (https://docs.python.org/3/tutorial/classes.html#class-definition-syntax). – unutbu

+1

Los [Python3 documentos] (https://docs.python.org/3/glossary.html#term-new-style-class) también establecen que una "clase de estilo nuevo" es el "nombre antiguo para el sabor de clases ** ahora usadas para todos los objetos de clase ** "(mi énfasis). Y [el estado de los documentos Python2] (https://docs.python.org/2/glossary.html#term-new-style-class) que una "clase de nuevo estilo" es cualquier clase que hereda de 'object'. Las dos declaraciones juntas implican que no es necesario incluir 'object' en la lista de bases de clases en Python3 ya que todas las clases son de estilo nuevo en Python3. – unutbu

14

La clase Table amplía una clase llamada object. No es un argumento La razón por la que puede querer extender object explícitamente es convertir la clase en una clase de nuevo estilo. Si no especifica explícitamente que se extiende a object, hasta Python 3, será una clase de estilo antiguo de forma predeterminada. (Desde Python 3, todas las clases son de estilo nuevo, extienda explícitamente object o no).

Para obtener más información sobre las clases de estilo antiguo y nuevo, por favor see this question.

+1

Esto es lo más respuesta directa y sucinta Gracias. – Sabuncu

2

clase La tabla y la clase de tabla (objeto) no son diferentes para Python.

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

Todo lo que dice es que hereda todo lo que se define en "objeto". Este es el comportamiento estándar.

+3

Las clases que se extienden 'object' automáticamente son comportamientos predeterminados solo en Python 3. En python 2, un objeto de extensión de clase tiene atributos que no tendrá una clase que no amplíe el objeto. –

1

Sólo una nota que el “nuevo estilo" vs distinción de clases ‘viejo estilo’ es específico de Python 2.x, 3.x en, todas las clases son ‘nuevo estilo’

0

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

¿Qué tal? Por lo tanto, cada cosa en Python viene bajo el objeto significa que todo en Python tiene propiedad de objeto, si está escrito o no lo entenderá. En primer lugar, explícitamente lo contamos en el segundo no lo hicimos.

+0

Este no es el caso en Python 2, ver la respuesta aceptada para los detalles. – niemmi

0

objeto es el tipo más básico de objeto de clase definido en python. atributos de objeto puede ser visto como abajo

** >>> dir (objeto)

[ 'clase', 'delattr', 'doc', 'formato' , 'getAttribute', 'de hash', 'init', 'nueva', 'reducir', 'reduce_ex ' 'repr', 'setattr', 'sizeof', 'str',' subclasshook '] **

Así Tabla (objeto) es sólo la herencia. !

Cuestiones relacionadas