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 的存在导致列表在滚动时不断重建其内容
reactjs - 在进行客户端查询时,我应该如何为 Github graphql API 提供身份
Python 修补类 - 方法 return_value 返回 MagicMock
sass - 当我在汇总中使用 scss 时出现意外字符 '@'(请注意,您需要插件才能导入非 Ja