如何找到Python对象的隐藏属性?(没有出现在dir(obj)列表中的属性)

弗拉德·阿德莱恩

我正在使用IPython。

我声明了一个简单的类MyClass(object),并在控制台中使用名称MyClass时,在dot运算符之后,我单击了Tab

我得到的第一个建议是mro,意思是MyClass.mro我按回车,我得到的输出是:

> <function mro>

现在,我没有定义此方法,当然它返回了我类的方法解析顺序。

此方法未出现在所返回的列表中dir(MyClass),因此这是我的问题:

我如何找到类或其他对象的任何其他此类隐藏特征?

巴库留

dir()不会尝试提供完整的输出,只是一个合理的近似是在交互式解释有用。

其原因dir包括__mro__mro在输出可以在源代码中可以发现,根据Objects/object.c在线路1812

/* Helper for PyObject_Dir of type objects: returns __dict__ and __bases__.
   We deliberately don't suck up its __class__, as methods belonging to the
   metaclass would probably be more confusing than helpful.
*/
static PyObject *
_specialized_dir_type(PyObject *obj)

并证明mro方法和__mro__属性实际上是元类的属性,即type

>>> '__mro__' in object.__dict__
False
>>> '__mro__' in type.__dict__
True
>>> 'mro' in object.__dict__
False
>>> 'mro' in type.__dict__
True

因此,它们不会显示在的输出中dir这是否明智取决于。我相信大多数的你真的做对的时候希望看到的元类定义,因为它们是元类的内部。


dir()的文档中所述,您可以自定义定义__dir__方法的输出但这适用于该类实例

class A(object):
  def __dir__(self):
    return ['a', 'b', 'c']

print(dir(A()), dir(A))

输出:

(['a', 'b', 'c'], ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__'])

如果您还想自定义输出,dir(A)则必须使用自定义元类:

class MyMeta(type):
  def __dir__(self):
    return ['a', 'b', 'c']


class A(object, metaclass=MyMeta):
  # __metaclass__ = MyMeta   # in python 2

  def __dir__(self):
    return ['a', 'b', 'c', 'd']


print(dir(A()), dir(A))

输出:

(['a', 'b', 'c', 'd'], ['a', 'b', 'c'])

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Eclipse Deployment Assembly没有出现在属性中

如何查找同一对象出现在列表中的次数,然后找到出现次数最多的对象的属性

“获取系列”对象没有属性“拆分””,“从推文中删除常用词时出现在索引ID中

为什么我的Swift struct属性没有出现在框架中?

为什么某些 css 属性没有出现在我的母版页中?

如何从对象数组中获取从未出现在特定属性中的值

如何让超类的继承属性出现在子类的对象中?

检查对象属性名称是否出现在字符串python中

如何使没有CommonPart的内容项出现在内容列表中?

如何从仅出现在console.log()中而不出现在JSON.stringify()中的JavaScript对象中获取属性?

如何遍历每个节点中的列表属性并查看它是否出现在其他节点属性中?

如何获取元素出现在列表Python中的次数

为什么最后一个命令变量“ _”没有出现在dir()中?

如何从列表中删除一个元素的所有出现在Python?

我如何找到崩溃的原因?我的应用程序没有出现在崩溃日志中

AttributeError:“列表”对象在python中没有属性“显示”

给定字典列表,我如何找到每个键出现在多少个字典中?

如果它们的值出现在列表中但不在表中,如何插入行;如果它们的值没有出现在列表中但在表中,如何删除行?

如何在stenciljs中访问本机HTML属性?以及如何使其出现在文档中?

应用程序没有出现在应用程序列表中?

我的Chromecast没有出现在接收者列表回调中

Thunk没有出现在React Native Debugger的动作列表中

Tomcat 8没有出现在Eclipse服务器列表中

Cron Job没有出现在WP-Control插件的cron列表中

Jupyter 文件打开没有出现在新文件列表中

滚动条没有出现在 CSS 的下拉列表中

在没有grep的情况下返回出现在R列表中的元素的数量

HDD没有出现在BIOS引导优先级列表中

为什么输入元素的“值”属性有时不会出现在 HTML 中?