class Foo(object):
pass
Приведенный выше класс является классом "нового стиля", поскольку он наследуется от класса object . Классы нового стиля предоставляют множество дополнительных рамок, которых нет в классах "старого стиля". Один особый атрибут класса нового стиля - возможность определять подклассы класса с помощью метода __ subclasses __ .
Есть некоторые хорошо обсуждение о классах нового стиля и методе __ подклассов __ , который используется для полного недокументированного . ( Здесь - неофициальное объяснение Тима Питерса.)
"Каждый класс нового стиля хранит список слабых ссылок на свои непосредственные подклассы. Этот метод возвращает список всех тех ссылок, которые еще живы."
Итак, чтобы ответить на ваш вопрос, функциональность __ подклассов __ недоступна, поскольку во втором примере:
class Foo():
pass
Класс Foo старого стиля не наследует от объекта (так что это не класс нового стиля) и там for не наследует метод __ подклассов __ .
Обратите внимание, если вы не понимаете, почему у класса старого стиля нет метода __ подклассов __ , вы всегда можете запустить интерпретатор python и выполнить некоторую проверку с помощью dir
>>> class Foo(object):
... pass
...
>>> dir(Foo.__class__)
['__abstractmethods__', '__base__', '__bases__', '__basicsize__', '__call__', '__class__', '__delattr__', '__dict__', '__dictoffset__', '__doc__', '__
eq__', '__flags__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__instancecheck__', '__itemsize__', '__le__', '__lt
__', '__module__', '__mro__', '__name__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__s
ubclasscheck__', '__subclasses__', '__subclasshook__', '__weakrefoffset__', 'mro']
>>> class Bar():
... pass
...
>>> dir(Bar.__class__)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: class Bar has no attribute '__class__'
>>> dir(Bar)
['__doc__', '__module__']
>>> dir(Foo)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '
__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']