Classe avec objet comme paramètre

114

J'essaye de traduire du code python en code scala. Je suis donc un noob total en Python.

Mais pourquoi certaines classes ont-elles un objet comme paramètre mais ne l'utilisent jamais explicitement? Quelle est la raison de l'avoir comme paramètre en premier lieu?

Exemple:

class Table(object)

Merci pour votre temps.

programmeur mythique
la source
1
duplication possible des classes de style ancien et nouveau en Python
JBernardo

Réponses:

112

En Python2, cela déclare Tableêtre une classe de style nouveau (par opposition à une classe "classique"). En Python3, toutes les classes sont des classes de nouveau style, donc ce n'est plus nécessaire.

Les nouvelles classes de style ont quelques attributs spéciaux qui manquent aux classes classiques.

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__']

De plus, les propriétés et super ne fonctionnent pas avec les classes classiques.

En Python2, c'est une bonne idée de créer toutes les classes des classes de style nouveau. (Bien que de nombreuses classes de la bibliothèque standard soient encore des classes classiques, par souci de compatibilité descendante.)

En général, dans une déclaration telle que

class Foo(Base1, Base2):

Fooest déclaré comme une classe héritant des classes de base Base1et Base2.

objectest la mère de toutes les classes en Python. C'est une classe de style nouveau, donc hériter de objectcrée Tableune classe de style nouveau.

unutbu
la source
pouvez-vous me rediriger vers une source qui mentionne que l'objet n'est pas nécessaire en tant que paramètre dans Python3? Je ne peux pas le trouver. Merci
Snow
1
Cela a été mentionné à plusieurs reprises sur StackOverflow ( ici, par exemple ), mais je n'ai pas pu trouver une simple déclaration à ce sujet dans la documentation. Il est montré implicitement (par l'omission de objectdans la liste des bases de classe) dans le tutoriel .
unutbu
1
La documentation Python3 déclare également qu'une «classe de nouveau style» est «l'ancien nom de la saveur des classes maintenant utilisée pour tous les objets de classe » (je souligne). Et la documentation Python2 indique qu'une "classe de nouveau style" est toute classe qui hérite de object. Les deux instructions réunies impliquent que vous n'avez pas besoin d'inclure objectdans la liste des bases de classes en Python3 puisque toutes les classes sont des classes de nouveau style en Python3.
unutbu
21

La Tableclasse étend une classe appelée object. Ce n'est pas un argument. La raison pour laquelle vous voudrez peut-être étendre objectexplicitement est que cela transforme la classe en une classe de nouveau style. Si vous ne le spécifiez pas explicitement object, jusqu'à Python 3, il sera par défaut une classe à l'ancienne. (Depuis Python 3, toutes les classes sont de style nouveau, que vous les étendiez explicitement objectou non.)

Pour plus d'informations sur les classes de style nouveau et ancien, veuillez consulter cette question .

icktoofay
la source
1
C'est la réponse la plus simple et la plus succincte. Merci.
Sabuncu
3

Il suffit de noter que la distinction entre les classes «nouveau style» et «ancien style» est spécifique à Python 2.x; en 3.x, toutes les classes sont «nouveau style».

Lawrence D'Oliveiro
la source
2

class Table et class Table (objet) ne sont pas différents pour Python.

Ce n'est pas un paramètre, il s'étend de l'objet (qui est la classe de base comme beaucoup d'autres langages).

Tout ce qu'il dit, c'est qu'il hérite de tout ce qui est défini dans "objet". C'est le comportement par défaut.

Devraj
la source
3
Les classes s'étendant automatiquement objectsont le comportement par défaut dans Python 3 uniquement. En python 2, un objet d'extension de classe a des attributs qu'une classe qui n'étend pas d'objet n'aura pas.
Lewis Ellis du
1

object est le type d'objet de classe le plus basique défini en python. Les attributs de l'objet peuvent être vus comme ci-dessous

** >>> dir (objet)

[ ' Classe ', ' delattr ', ' doc ', ' Format ', ' getattribute ', ' hash ', ' initialisation ', ' nouveau ', ' réduire ', ' reduce_ex ', ' rééd ', ' setattr ', ' sizeof ',' str ',' subclasshook '] **

Donc, Table (objet) n'est qu'un héritage.!

Anilkumar Mallakkanavar
la source
0

1) Nom de classe (objet): 2) nom de classe: Ils sont tous les deux identiques mais les premiers sont bien meilleurs en termes d'écriture, cela a l'air mieux tout en héritant d'autres classes à une autre, cela semble homogène.

Comment pareil? Ainsi, chaque chose en Python est sous objet signifie que tout en Python a la propriété d'objet, si elle est écrite ou non, elle le comprendra. Dans la première, nous le disons explicitement dans la seconde, nous ne l'avons pas fait.


la source
Ce n'est pas le cas dans Python 2, voir la réponse acceptée pour les détails.
niemmi