Ответ 1
class Foo(object):
pass
Класс выше - это класс "нового стиля", потому что он наследует класс object. Классы нового стиля предоставляют множество дополнительных фреймворков, которые не имеют классов "старого стиля". Одним из атрибутов класса нового стиля является возможность определять подклассы класса с помощью метода __ подклассов __.
Есть некоторые good обсуждение о классах нового стиля и методе __ подклассы __, которые используются полностью недокументированные. (Здесь является неофициальным объяснением Тима Петерса.)
"Каждый класс нового стиля хранит список слабых ссылок на его непосредственные подклассы. Этот метод возвращает список всех этих ссылок, которые все еще живы".
Итак, чтобы ответить на ваш вопрос, функциональность ___ подклассов __ недоступна, потому что в вашем втором примере:
class Foo():
pass
Класс старого стиля Foo не наследуется от объекта (так что это не класс нового стиля), и там для него не наследуется метод __ подклассов __.. p >
Обратите внимание: если вы не понимаете, почему класс старого стиля не имеет метода ___ подклассов __, вы всегда можете запустить интерпретатор 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__']