在对各种设置进行检查时,似乎您的查询是基于对象
类的属性:
"".__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类。如果您需要保留此检查,您将需要修复上下文以使其可重现。您可以使用特定镜像的环境或容器来实现这一点。或者设计另一个更具弹性的检查。
object
子类,因为IDLE是用Python编写的 - 它显然导入或定义了总共155个类。这些导入的类在其他环境中并不是任何意义上的“缺失”,它们只是没有被导入,因此object
不知道它们的存在。 - jasonharper