【问题标题】:calling help(MyClass) also shows base class attributes: how to avoid that?调用 help(MyClass) 还显示基类属性:如何避免这种情况?
【发布时间】:2017-10-18 13:45:07
【问题描述】:

MyClass 派生自“list”:MyClass(list) 我想很好地记录 MyClass 。 不幸的是,在尝试帮助(MyClass)时, 我有自己的文档,但我也有很多关于“列表”的东西。

是否有一种简单的方法来控制它? 我读过一些关于元类的文章,但我无能为力。

感谢您的建议,

米歇尔

【问题讨论】:

    标签: python-3.x documentation metaclass derived


    【解决方案1】:

    嗯,这就是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 的冗长。

    【讨论】:

    • 非常感谢 jsbueno !我错过了“metaclass=M”的东西。我天真地以为链接是在 __init__() 中建立的。帮助中仍然存在“方法解析顺序:...”,但这不是大问题。
    • 它“可以”......但我会说这不是正确的做法。您可以在技术上用自定义类替换模块,在加载后替换 sys.modules 字典中的条目或通过自定义“导入”管道。尽管您可能需要一个框架来从文档字符串中编译正确的文档,例如 sphynx。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 2022-06-14
    • 1970-01-01
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多