2009-11-09 5 views
0

J'ai créé une classe simple en Python comme suit,quelque chose de dérangeant contenu PyDev aider

from UserDict import UserDict 

class Person(UserDict): 
def __init__(self,personName=None): 
    UserDict.__init__(self) 
    self["name"]=personName 

Dans un autre module, j'essaie d'instancier un objet de classe Person et imprimer son doc et classe attributs:

import Person 
p = Person.Person("me") 
print p.__doc__ 
print p.__class__ 

Il me dérange de penser que doc et classe sont pas dans la liste des attributs d'un objet instancié lorsque j'utilise le contenu aider à Eclipse:

alt text http://img171.imageshack.us/img171/5169/pydevcontentassist.png

Pourquoi cela? En Java, Eclipse affiche la liste complète des attributs et des méthodes et cela m'aide beaucoup dans le développement parfois quand je ne veux pas regarder les documents Java. Je viens de comprendre les choses en utilisant l'aide au contenu.

Répondre

1

EDIT:

Votre personne de classe est une classe dite ancienne car elle est sous-classé de la classe UserDict, une classe de style ancien. Il existe des différences fondamentales entre l'ancien et le nouveau style (c'est-à-dire les classes qui relèvent de la sous-classe object) dans la disponibilité et le traitement des attributs spéciaux. En particulier, dir() d'une instance d'une classe ancienne ne retourne pas __class__, alors que dir() des instances de classe nouveau style faire, et, sans aucun doute, PyDev affiche les résultats de dir():

>>> class OldStyle: pass 
... 
>>> os = OldStyle(); os.__class__; dir(os) 
<class __main__.OldStyle at 0x100412cb0> 
['__doc__', '__module__'] 
>>> class NewStyle(object): pass 
... 
>>> ns = NewStyle(); ns.__class__; dir(ns) 
<class '__main__.NewStyle'> 
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__'] 

Comme décrit dans la récente Python Standard Library documentation, le besoin de UserDict a largement disparu depuis, avec le introduction of new-style classes in Python 2.2, il est maintenant possible de sous-classer directement à partir de types intégrés comme dict. Il existe d'autres inconvénients liés à l'utilisation de classes de style ancien et ils ont été entièrement supprimés dans Python 3, avec le module UserDict. Vous pouvez obtenir les avantages maintenant, et obtenir de meilleures informations dans PyDev, en changeant la classe Person en sous-classe directement à partir de dict.

+0

doc est là, mais je ne vois pas de classe nulle part dans la liste. – Jeune

+0

Ah, c'est vrai. Oubliez la réponse originale: le problème et la solution sont plus simples. Voir la réponse éditée. –

+0

Oh je vois. C'était une bouchée! Merci beaucoup. Je suis en train de lire Dive into Python et d'utiliser Python 2.6 et c'est là que j'ai appris à utiliser des classes de style ancien. Est-ce que je vous recommande de lire Plongez dans Python 3 et d'utiliser Python 3 à la place? – Jeune

2

Vous ne savez pas si quelqu'un en dehors de l'équipe de développement de PyDev peut vraiment vous aider, car cela se résume à une question/demande. Je suggère de créer un élément sur leur Feature Request tracker ou leur bug tracker.

Questions connexes