2010-10-07 5 views
1

pourquoi, si je fais:type de classe en python

class C(): pass 
type(C()) 

je me suis: <type 'instance'>, mais si je fais:

class C(object): pass 
type(c()) 

je me suis: <class '__main__.c'>?

Le premier n'est pas très userfull

+0

Que voulez-vous avoir à la place? Qu'est-ce qui n'est pas utile? Que c'est différent? –

+0

Quelle est votre question? – SilentGhost

Répondre

2

Recherchez la différence entre les anciennes classes et les nouvelles classes. Les premiers sont les paramètres par défaut et les seconds héritent explicitement de l'objet.

Tous les objets de style ancien ont été implémentés avec l'instance de type intégrée. Le fait qu'ils soient toujours par défaut et que leur type reste 'instance' est le résultat de précautions de rétrocompatibilité.

Ceci est extrait de la documentation python (http://docs.python.org/reference/datamodel.html)

3.3. Classes de style nouveau et classique Les classes et les instances sont disponibles en deux saveurs : style ancien (ou classique) et nouveau style.

Jusqu'à Python 2.1, les classes de style ancien étaient la seule saveur à la disposition de l'utilisateur . Le concept de classe (ancien style) est sans rapport avec le concept de type: si x est une instance d'une ancienne classe , puis x. classe désigne la classe de x, mais le type (x) est toujours . Ceci reflète le fait que toutes les instances de style ancien, , indépendamment de leur classe, sont implémentées avec un seul type intégré , appelé instance.

Les classes de style nouveau ont été introduites dans Python 2.2 pour unifier les classes et les types. Une classe de style nouveau n'est ni plus ni inférieure à un type défini par l'utilisateur. Si x est une instance d'une nouvelle classe, alors le type (x) est typiquement le même que x>. class (bien que ce ne soit pas garanti - une nouvelle classe de classe est autorisée à remplacer la valeur retournée pour x classe).

La principale motivation pour l'introduction classes du nouveau modèle est de fournir un modèle d'objet unifié avec une pleine méta-modèle . Il a également un certain nombre de avantages pratiques, comme la capacité pour sous-classer la plupart des types intégrés, ou l'introduction de "descripteurs", qui permettent des propriétés calculées.

Pour des raisons de compatibilité, les classes sont par défaut.Les nouvelles classes sont créées en spécifiant une autre classe de nouveau style (un type) en tant que classe parente, ou l'objet de type " de niveau supérieur" si aucun autre parent n'est requis. Le comportement des nouvelles classes diffère de celui des anciennes classes dans un certain nombre de détails importants en plus de ce que retourne le type() . Certains de ces changements sont fondamental pour le nouveau modèle d'objet, comme la façon dont les méthodes spéciales sont invoquées. D'autres sont des "correctifs" qui pourraient ne pas être implémentés auparavant pour des problèmes de compatibilité , comme l'ordre de résolution de méthode en cas d'héritage multiple .

Ce manuel vise à fournir une couverture complète de mécanique de classe de Python, il peut encore être manque dans certaines régions en matière de sa couverture des nouvelles classes de style. Veuillez consulter http://www.python.org/doc/newstyle/ pour obtenir des informations supplémentaires.

Les classes de style ancien sont supprimées dans Python 3.0, ne laissant que la sémantique de nouvelles classes de classes de style nouveau.

+0

vous devez éditer votre réponse et changer tous vos "x .__ class__" en "' '' '\' .__ classe __ \ '' " – tzot

1

Honnêtement, je ne pense pas une réponse courte est en ordre ici. Je vous conseille de commencer à lire sur les classes d'unification/nouveau style de Python ici: http://www.python.org/doc/newstyle/