【问题标题】:__dir__() in class and in metaclass__dir__() 在类和元类中
【发布时间】:2017-10-20 09:50:01
【问题描述】:

我只是第一次使用元类。 目的是控制类或实例的 help() 输出。 在元类的 __dir__() 函数中指定属性允许我控制帮助内容。 但是,我观察到对于 intellisense/code_completion,在 Jupyter 中,重要的是类本身的 __dir__() 函数。

了解事实就足够了。 不过,我想知道原因。

感谢您的澄清。

【问题讨论】:

  • 帮助内容? dirdir() 的实现,应该打印对象的属性dict
  • 是的,但是来自 Jupyter 的 help() 似乎使用 __dir__() 来决定帮助内容。我不知道这是否特定于 Jupyter,或者这种行为是否有更普遍的原因。然而,为什么以及何时使用类或元类中的 __dir__()?

标签: python metaclass


【解决方案1】:

正如我在other answer about this topic 中所说,Python 没有定义如何选择help 的内容。由于语言的性质,使用metaclass __dir__ 是可行的,但第三方模块肯定不会期望它返回自定义结果,与类的目录不同,因为它不是常见的东西.

因此,您正在尝试自定义不可自定义的功能 - 您将不得不创建一个新类来代理所有不需要的用户方法,因此可以隐藏帮助和目录您不需要的内容想要展示或创建一个完整的应用程序来满足您的需求,而不是依赖 Jupiter 笔记本来显示您的特定说明并且仅显示这些说明。

总体而言,如果您出于其他目的使用元类,可以,但如果您使用元类只是为了尝试覆盖 help 输出,我会说这已经是不正确的使用了。

另一种选择是在您的类中粘贴一个可手动调用的“help2”方法,该方法仅打印您想要的输出。然后你记录在主类文档字符串“请使用classname.help2() 来学习用法。”,否则留下__dir__

【讨论】:

  • 感谢您的澄清。这是我第一次想记录我的代码!我喜欢 docstring 的想法,但在使用它们时我有点失望。我的目标是避免将我的东西与许多无用的附加功能混在一起。
  • 我想我还提到你应该看看 sphinx,以及它如何利用正确格式化的文档字符串为你的所有项目生成一流的离线(即“无帮助”)文档.你真的应该去那里。 thomas-cokelaer.info/tutorials/sphinx/docstring_python.html
猜你喜欢
  • 2014-08-24
  • 2021-05-09
  • 2023-03-15
  • 1970-01-01
  • 2010-12-08
  • 2020-01-17
  • 2014-08-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多