我最近去了一个采访并做了一些小编程测试,他们有一个简单的两个类脚本,可以计算面积,边长等。它的形状看起来像这样:
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()
时不会发生任何事情,我是不正确的?
答案 0 :(得分:2)
如果您查看pydoc.Helper
类的来源(特别是其help()
方法),这实际上就是您致电help()
时获得的内容,您会看到它仍然会使用inspect
模块和其他一些技巧获得对象的基本结构。
当然,目标是在原始代码编写者没有编写文档时,至少为其他开发人员提供对象/函数签名。就个人而言,我还没有看到help()
存在于全局命名空间中的原因,但我明白为什么他们从历史和哲学的角度来看待它。
话虽这么说,无论是采访过你的人,IMO,还是一个混蛋 - 这对于编程并不是很有用,但是我可以说,这可能是非恐怖的。也就是说,假设他们并没有试图让你使用@abstractmethod
描述符,当然,这可能是一个有效的问题。
答案 1 :(得分:2)
您对代码的描述中有一些内容可能是他们期望您提及的内容。这对我来说并不是很明显,哪一个是你对代码记忆的错误,哪个是真正的问题,但它们都是要考虑的事情:
您展示的Shape
课程中包含@abstractmethod
。如果它有一个正确定义的元类(从abc.ABCMeta
派生的东西),你将无法从中创建任何实例。只能实例化覆盖每个抽象方法的具体子类。因此,他们可能希望您说“您无法在help()
上致电Shape(...)
,因为后者会导致TypeError
。
在实例上调用help
将为您提供每个类的方法的描述,即使它没有文档字符串。如果存在docstring,它将首先显示,但方法(和描述符等)的文档将始终如下。