在python中使用__doc__并在类上使用help()

时间:2017-02-21 23:41:32

标签: python pydoc

我最近去了一个采访并做了一些小编程测试,他们有一个简单的两个类脚本,可以计算面积,边长等。它的形状看起来像这样:

class Shape(object):

    def __init__(self, side1, side2, side3, side4):
        self.side1 = side1
        ...

    @abstractmethod
    def calc_area(self):
        pass

class Triangle(Shape):

    def calc_area(self):
        ... etc..

他们问我的一个问题是,如果我们运行help(Shape(3, 5, 5, 6))假设所有对象都已初始化会发生什么?我的答案是,没有,因为没有docstring__doc__。看来我在这个答案上被标记了,我似乎无法理解为什么?我认为在运行help()时不会发生任何事情,我是不正确的?

2 个答案:

答案 0 :(得分:2)

如果您查看pydoc.Helper类的来源(特别是其help()方法),这实际上就是您致电help()时获得的内容,您会看到它仍然会使用inspect模块和其他一些技巧获得对象的基本结构。

当然,目标是在原始代码编写者没有编写文档时,至少为其他开发人员提供对象/函数签名。就个人而言,我还没有看到help()存在于全局命名空间中的原因,但我明白为什么他们从历史和哲学的角度来看待它。

话虽这么说,无论是采访过你的人,IMO,还是一个混蛋 - 这对于编程并不是很有用,但是我可以说,这可能是非恐怖的。也就是说,假设他们并没有试图让你使用@abstractmethod描述符,当然,这可能是一个有效的问题。

答案 1 :(得分:2)

您对代码的描述中有一些内容可能是他们期望您提及的内容。这对我来说并不是很明显,哪一个是你对代码记忆的错误,哪个是真正的问题,但它们都是要考虑的事情:

  1. 您展示的Shape课程中包含@abstractmethod。如果它有一个正确定义的元类(从abc.ABCMeta派生的东西),你将无法从中创建任何实例。只能实例化覆盖每个抽象方法的具体子类。因此,他们可能希望您说“您无法在help()上致电Shape(...),因为后者会导致TypeError

  2. 在实例上调用help将为您提供每个类的方法的描述,即使它没有文档字符串。如果存在docstring,它将首先显示,但方法(和描述符等)的文档将始终如下。