python - Linux 命令行中 Python 对象类的子类

Linux 上的 Python 安装通过此查询识别了对象类的 187 个子类:

kali@kali:~$ python3 -c 'print(len("".__class__.__mro__[1].__subclasses__()))'

IDLE shell 中的相同查询识别出 342 个子类,而在 IDE PyCharm 中只有 217 个!

用户能否决定哪些子类在给定环境中可操作,或者子类是否由供应商严格执行?

最佳答案

在对各种设置执行检查时,您的查询似乎是基于 object 类的属性:

"".__class__.__mro__
(<class 'str'>, <class 'object'>)

因此您的查询可以翻译为:

len(object.__subclasses__())

让我们将您的问题改写为:为什么 object 类的子类的数量会随着上下文而变化?

关键是:您的查询从字面上计算从类对象继承的类的数量(阅读更多关于此 specific class )在查询时,这个计数绝对取决于您的版本python、环境和导入。

因为从 object 继承的对象数量不同,所以在这两种情况下 python 的初始化肯定是不同的。

例如,定义一个依赖于(显式或非显式)object 的类就足以改变这个计数:

>>> len(object.__subclasses__())
282
>>> class A(object):
...    pass
...
>>> len(object.__subclasses__())
283
>>> class B:
...     pass
...
>>> len(object.__subclasses__())
284

导入一个包确实也会改变这个计数:

>>> import pandas as pd
>>> len(object.__subclasses__())
712

请注意,它还取决于环境。所以基本上它取决于 PYTHONPATH 和可以在此路径中找到的已安装模块:

> activate base
(base) > python -c "print(len(object.__subclasses__()))"
202
(base) > activate test
(test) > python -c "print(len(object.__subclasses__()))"
139

所以答案几乎可以肯定是因为你运行的 IDLE 不是同一个 python 版本或者它没有相同的环境或者它导入了与 PyCharm IDE 不同的模块。

正如@jasonharper IDLE 所指出的那样,IDLE 可能已经导入了确实会增加计数的 python 类。

因此,如果您需要保留此检查,则必须修复上下文以使其可重现。您可以为此使用具有特定图像的环境或容器。或者设计另一个更具弹性的支票。

https://stackoverflow.com/questions/72919450/

相关文章:

windows - 为什么 powershell 说 cl.exe 不被识别?

python - 同时从两列中减去值( Pandas , python )

ios - @Environment dismiss 的存在导致列表在滚动时不断重建其内容

python - 我应该如何打破这个问题的循环?

reactjs - 在进行客户端查询时,我应该如何为 Github graphql API 提供身份

mermaid - 使用渲染函数时节点上的事件不调用函数

Python 修补类 - 方法 return_value 返回 MagicMock

sass - 当我在汇总中使用 scss 时出现意外字符 '@'(请注意,您需要插件才能导入非 Ja

github-pages - 自定义 GitHub 页面部署说明

python - 为什么这两种计算总和的方法会产生不同的运行时间