在Linux命令行中Python的object类的子类

3
在Linux上进行Python安装,可以通过以下查询识别出对象类的187个子类:
kali@kali:~$ python3 -c 'print(len("".__class__.__mro__[1].__subclasses__()))'

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

用户能否决定在给定环境中哪些子类是有效的,还是子类由供应商严格执行?


我已经编辑了原始问题以进行澄清。 - rdre8
我从未见过任何缺少类的环境,你有例子吗? - azro
嗨Azro,我最初给了一个例子。IDLE shell有一个非常完整的342个子类列表,包括subprocess.Popen和subprocess.CompletedProcess。然而,在Kali Linux上Python3安装的仅有187个子类列表中,并没有这些以及许多其他子类。 - rdre8
1
Kali是一种非常专业的发行版,可能并不代表Linux的普遍情况。 - tripleee
2
IDLE在启动时显示了更多的object子类,因为IDLE是用Python编写的 - 它显然导入或定义了总共155个类。这些导入的类在其他环境中并不是任何意义上的“缺失”,它们只是没有被导入,因此object不知道它们的存在。 - jasonharper
显示剩余3条评论
1个回答

2

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

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

因此,您的查询可以翻译为:
len(object.__subclasses__())

让我们把你的问题改一下:为什么类object的子类数量会因上下文而异?
关键在于:你的查询字面上计算继承自类object的类的数量(可以在此查看更多),并且这个数量肯定取决于你的python版本、环境和导入情况。
当然,两种情况下python的初始化肯定是不相等的,因为继承自object的对象数量是不同的。
例如,定义一个依赖于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与PyCharm IDE不同,可能是Python版本不同、环境不同或导入的模块不同。正如@jasonharper所指出的那样,IDLE可能已经导入了增加计数的Python类。如果您需要保留此检查,您将需要修复上下文以使其可重现。您可以使用特定镜像的环境或容器来实现这一点。或者设计另一个更具弹性的检查。

1
我已经编辑了原始问题以澄清问题。 - rdre8
1
@rdre8,我已经更新了我的回答来解决你的更新问题。期待您的反馈。 - jlandercy
谢谢jlandercy,你提供的细节确实非常有帮助。我假设你在最后一个例子中切换了两个虚拟环境(base和test)。你真的可以使用“activate venv_name”命令进行切换吗?因为我认为这是先停用一个,然后使用source venv_name/bin/activate来激活另一个的问题? - rdre8
不客气。在这个例子中,我使用了conda,默认情况下,在激活新环境时会停用它,因此计数会减少。请参阅文档中的嵌套环境(https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html#nested-activation)。干杯! - jlandercy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接