【发布时间】:2017-10-18 13:45:07
【问题描述】:
MyClass 派生自“list”:MyClass(list) 我想很好地记录 MyClass 。 不幸的是,在尝试帮助(MyClass)时, 我有自己的文档,但我也有很多关于“列表”的东西。
是否有一种简单的方法来控制它? 我读过一些关于元类的文章,但我无能为力。
感谢您的建议,
米歇尔
【问题讨论】:
标签: python-3.x documentation metaclass derived
MyClass 派生自“list”:MyClass(list) 我想很好地记录 MyClass 。 不幸的是,在尝试帮助(MyClass)时, 我有自己的文档,但我也有很多关于“列表”的东西。
是否有一种简单的方法来控制它? 我读过一些关于元类的文章,但我无能为力。
感谢您的建议,
米歇尔
【问题讨论】:
标签: python-3.x documentation metaclass derived
嗯,这就是help 所做的。它自省到您的类,并为类中的每个可调用属性显示名称和关联的__doc__,这是不可自定义的。
超类的属性被认为是类的属性,并在 Python 的自省帮助中得到。
元类甚至可以用来自定义当他对你的类执行“dir”时得到的输出——但它们不会改变帮助文本的输出。要更改“dir”输出,请创建一个实现 __dir__ 方法的元类,并返回您希望作为 dir 输出可见的内容的列表。
class M(type):
def __dir__(self):
return [] # blank dir contents
class MyList(list, metaclass=M):
...
另一方面,list 属性显示的帮助内容并没有那么冗长,而且实际上很有帮助 - 如果您重写任何方法以执行与描述不同的操作,则无论如何都不会显示不正确的文本。所以你可能只是忍受它。
另一个提示是,您可能更愿意将 collections.abc.MutableSequence 子类化,而不是子类化 list,并使用内部聚合(正常)列表来保存数据:这将需要您实现更少的方法来拥有您的类作为一个序列正常工作,并且在大多数情况下比子类列表更可取。不过,这不会改变help 的冗长。
【讨论】:
sys.modules 字典中的条目或通过自定义“导入”管道。尽管您可能需要一个框架来从文档字符串中编译正确的文档,例如 sphynx。