__doc__ 在 python 上使用 help() 在 class

__doc__ in python and using help() on a class

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

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() 时什么都不会发生是我的错误想法吗?

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

当然,如果原始代码编写者不费心编写文档,我们的目标是至少向其他开发人员提供 object/function 签名。就个人而言,我不明白 help() 存在于全局命名空间中的原因,但我理解他们为什么从历史和哲学的角度放置它。

话虽如此,在我看来,无论谁采访了你,他都是个混蛋——这与编程并没有太大关系,而是吹毛求疵,我可以说,这很不符合 Python 风格。也就是说,假设他们没有试图让您进入 @abstractmethod 描述符,当然,这可能是一个有效的问题。

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

  1. 你显示的Shapeclass里面有一个@abstractmethod。如果它有一个正确定义的 metaclass(从 abc.ABCMeta 派生的东西),您将无法从中创建任何实例。只有覆盖了每个抽象方法的具体子classes 才能被实例化。所以他们可能希望你说“你不能在 Shape(...) 上调用 help() 因为后者会导致 TypeError.

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