Linux上的Python安装通过此查询识别对象类的187个子类:
kali@kali:~$ python3 -c 'print(len("".__class__.__mro__[1].__subclasses__()))'
在空闲shell中的同一查询标识了342个子类,而在IDE中只有217!
用户能否决定哪些子类在给定环境中是可操作的,或者子类是否由供应商严格执行?
Linux上的Python安装通过此查询识别对象类的187个子类:
kali@kali:~$ python3 -c 'print(len("".__class__.__mro__[1].__subclasses__()))'
在空闲shell中的同一查询标识了342个子类,而在IDE中只有217!
用户能否决定哪些子类在给定环境中是可操作的,或者子类是否由供应商严格执行?
在对各种设置执行判断时,您的查询似乎基于object
类的属性:
"".__class__.__mro__
(<class 'str'>, <class 'object'>)
因此,您的查询可以翻译为:
len(object.__subclasses__())
让我们把你的问题改写为:Why does the count of subclasses of the class 100 vary with respect to the context?
关键是:您的查询从字面上统计从类对象继承的类的数量(阅读更多关于这specific class的内容)at the moment of querying,并且这个数量肯定取决于您的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
所以答案几乎是肯定的,因为空闲的ran不是相同的python版本,或者它没有相同的环境,或者它导入了与PyCharm IDE不同的模块.
正如@jasonharper所指出的,IDLE可能导入了python类,从而增加了计数.
因此,如果你需要保持这种判断,你必须修复上下文,使其可复制.为此,您可以使用具有特定图像的环境或容器.或者设计另一种更具弹性的判断.