Хорошо, обычно "super()
нельзя использовать с классом старого стиля".
Тем не менее, важным моментом является то, что правильный тест для "это новый экземпляр (т.е. объект)?" есть
>>> class OldStyle: pass
>>> instance = OldStyle()
>>> issubclass(instance.__class__, object)
False
а не (как в вопросе):
>>> isinstance(instance, object)
True
Для классов правильный тест "это класс нового стиля":
>>> issubclass(OldStyle, object) # OldStyle is not a new-style class
False
>>> issubclass(int, object) # int is a new-style class
True
Критическая точка заключается в том, что в классах старого стиля класс экземпляра и его тип различны. Здесь OldStyle().__class__
- это OldStyle
, который не наследуется от object
, а type(OldStyle())
- это тип instance
, который действительно наследует от object
. По сути, класс старого стиля просто создает объекты типа instance
(тогда как класс нового стиля создает объекты, тип которых является самим классом). Вероятно, именно поэтому экземпляр OldStyle()
является object
: его type()
наследуется от object
(тот факт, что его класс не наследует от object
, не считается: старый стиль классы просто создают новые объекты типа instance
). Частичная ссылка: https://stackoverflow.com/a/9699961/42973.
PS: разницу между классом нового стиля и классом старого стиля можно также увидеть с помощью:
>>> type(OldStyle) # OldStyle creates objects but is not itself a type
classobj
>>> isinstance(OldStyle, type)
False
>>> type(int) # A new-style class is a type
type
(классы старого стиля , а не , поэтому они не могут быть типами своих экземпляров).