关于PyDev内容助手的令人不安之处
我在Python里创建了一个简单的类,代码如下:
from UserDict import UserDict
class Person(UserDict):
def __init__(self,personName=None):
UserDict.__init__(self)
self["name"]=personName
在另一个模块里,我试着创建一个Person类的对象,并打印它的doc和class属性:
import Person
p = Person.Person("me")
print p.__doc__
print p.__class__
我觉得有点烦的是,当我在Eclipse里使用内容辅助功能时,doc和class并没有出现在实例化对象的属性列表里:
这里有个图片链接 http://img171.imageshack.us/img171/5169/pydevcontentassist.png
为什么会这样呢?在Java中,Eclipse会显示完整的属性和方法列表,这在开发时对我帮助很大,有时候我不想去查Java文档,只想通过内容辅助功能来搞定事情。
2 个回答
1
编辑:
你的类 Person 是一种旧式类,因为它是从 UserDict
这个旧式类派生出来的。旧式类和新式类(也就是那些从 object
派生的类)在一些特殊属性的可用性和处理方式上有根本的区别。特别是,旧式类的实例用 dir()
函数查看时,不会返回 __class__
,而新式类的实例则会返回这个属性,毫无疑问,PyDev
正在显示 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__']
根据最近的 Python 标准库文档,由于在 Python 2.2 中引入了新式类,UserDict
的需求基本上已经消失了,现在可以直接从内置类型如 dict
进行派生。使用旧式类还有其他缺点,而这些在 Python 3 中已经完全被移除,包括 UserDict
模块。你现在可以通过将 Person
类直接从 dict
派生来获得这些好处,并在 PyDev
中获得更好的信息。