Почему экземпляры классов старого стиля являются экземплярами «объекта»?

Почему в Python 2 экземпляры классов старого стиля по-прежнему являются экземплярами object, даже если они явно не наследуются от object?

class OldClass:
    pass

>>> isinstance(OldClass(), object)
True

Прежде чем тестировать это, я бы пришел к выводу, что isinstance(x, object) == True будет означать, что x является экземпляром подкласса object и, следовательно, экземпляром класса нового стиля, но похоже, что все объекты в Python 2 являются экземплярами object (да, я знаю как очевидно это звучит)


Копаясь дальше, я обнаружил еще одно, казалось бы, странное поведение:

>>> issubclass(OldClass, object)
False

У меня сложилось впечатление, что isinstance(x, SomeClass) практически эквивалентно issubclass(x.__class__, SomeClass), но, видимо, я что-то упускаю.


person Billy    schedule 15.06.2017    source источник
comment
@ Jean-FrançoisFabre Как это вообще отвечает на вопрос?   -  person Markus Meskanen    schedule 15.06.2017
comment
ответ на этот конкретный вопрос (кроме ссылки на исходный вопрос): потому что он был разработан таким образом.   -  person Jean-François Fabre    schedule 15.06.2017
comment
Буквально просто классы старого стиля неявно наследуют объект, новые просто меняют это на явное наследование.   -  person Keef Baker    schedule 15.06.2017
comment
@ Jean-FrançoisFabre Потому что это так задумано, что ?? На этот вопрос может правильно ответить тот, кто знает, как работают классы старого стиля. Если экземпляр Foo также является экземпляром object, как он был спроектирован таким образом, чтобы ответить, почему Foo не является подклассом object?   -  person Markus Meskanen    schedule 15.06.2017
comment
@KeefBaker Если классы старого стиля неявно наследуют объект, то почему issubclass(OldClass, object) == False в примере OP?   -  person Markus Meskanen    schedule 15.06.2017
comment
Потому что я не умею читать.   -  person Keef Baker    schedule 15.06.2017
comment
Достаточно честно :D @KeefBaker   -  person Markus Meskanen    schedule 15.06.2017
comment
Все является экземпляром object, но классы старого стиля имеют разделенную реализацию. Сам класс является экземпляром classobj, а его экземпляры являются instance объектами.   -  person Eryk Sun    schedule 15.06.2017
comment
Извините, я не могу найти ответ на этот вопрос по этой ссылке, он просто противопоставляет две разные функции (как я понимаю: isinstance ожидает объект в качестве первого аргумента, issubclass ожидает класс/тип в качестве первого аргумента)   -  person Billy    schedule 15.06.2017
comment
Я согласен, что это не хороший «дубликат». Наверное, надо открыть заново.   -  person Dylan Meeus    schedule 15.06.2017
comment
Я закрыл вопрос и не открываю его повторно (потому что каждый раз, когда я это делал, кто-то отвечал точно на тот же вопрос в дубликате, и он все равно был закрыт как дубликат). Вы можете проголосовать за повторное открытие / положиться на какого-нибудь владельца золотого значка Python, чтобы снова открыть его.   -  person Jean-François Fabre    schedule 15.06.2017
comment
@eryksun: Не могли бы вы снова открыть и объяснить разделенную реализацию в ответе?   -  person Billy    schedule 15.06.2017
comment
@eryksun как вы думаете, вы можете ответить на этот конкретный вопрос, не дублируя ссылку? если да, то у вас есть возможность сделать это (я не хочу быть здесь плохим парнем)   -  person Jean-François Fabre    schedule 15.06.2017
comment
@Jean-FrançoisFabre Ответы на другой вопрос. Поскольку вы используете класс старого стиля, вместо этого используйте класс нового стиля, в то время как в этом вопросе явно признается использование класса старого стиля и запрашиваются дополнительные технические детали, стоящие за ним, чтобы выяснить почему такое поведение происходит. По определению isinstance() и issubclass всегда должно быть issubclass(Foo, Bar) == isinstance(Foo(), Bar), но здесь это не так, поэтому OP задал вопрос.   -  person Markus Meskanen    schedule 15.06.2017
comment
@MarkusMeskanen Я думаю, вы перестали читать после принятого ответа. Другой ответ (с более чем 30 голосами) намного лучше, и я думаю, что он отвечает на текущий вопрос. Тот факт, что его еще никто не открывал, является еще одним признаком.   -  person Jean-François Fabre    schedule 15.06.2017
comment
Этот ответ также не отвечает на этот вопрос. Речь идет о старых классах, являющихся экземплярами object, но не его подклассами. Этот вопрос о том, почему экземпляр класса старого стиля также является экземпляром object, что абсолютно бессмысленно, поскольку класс старого стиля не является подклассом object.   -  person Markus Meskanen    schedule 15.06.2017
comment
И issubclass(OldClass, OtherOldClass), и isinstance(OldClass(), OldClass) имеют особый регистр. Для последнего он должен получить атрибут __class__ из экземпляра OldClass(), чтобы проверить форму issubclass в специальном регистре. Мы можем углубиться в детали реализации в CPython, но я думаю, что достаточно знать, что между OldClass и OldClass() нет связи на основе типов. Только в Python 2.2 типы и классы были унифицированы таким образом, что type(NewClass()) is NewClass.   -  person Eryk Sun    schedule 15.06.2017
comment
Если то, что сказал Эриксун, правда, то это должен быть ответ на этот вопрос. Я не вижу ничего подобного в другом вопросе. Пожалуйста, откройте уже @Jean-FrançoisFabre   -  person Markus Meskanen    schedule 15.06.2017
comment
@eryksun: поскольку вопрос снова открыт, вы должны превратить свой комментарий в ответ.   -  person Jean-François Fabre    schedule 15.06.2017
comment
Кто-нибудь, пожалуйста, ответьте на этот вопрос. Эта цепочка комментариев становится смешной.   -  person idjaw    schedule 15.06.2017
comment
@MarkusMeskanen, можете ли вы объяснить, почему применимы внутренние компоненты python ? Вопрос не о внутренней работе интерпретатора, и для ответа на него достаточно знать модель данных Python 2.   -  person vaultah    schedule 15.06.2017
comment
@vaultah Как Python работает под капотом? это определение для python-internals, разве этот вопрос не об этом? Похоже, что Python делает что-то странное с issubclass() и isinstance(), что не соответствует ожиданиям непрофессионала, и требует дальнейшего изучения того, как именно классы старого стиля работают с issubclass() и isinstance(). Может я ошибся с тегом, просветите меня, если это так.   -  person Markus Meskanen    schedule 15.06.2017
comment
Как видите, вопрос был вновь открыт, затем закрыт как дубликат... снова. В какой-то момент вы должны отпустить его: это реторический вопрос о python 2.x, просто для любопытства, но не очень полезный в реальной жизни.   -  person Jean-François Fabre    schedule 15.06.2017
comment
Спасибо - новый дубликат проясняет ситуацию. Я не знаю, почему это не появилось, когда я впервые искал.   -  person Billy    schedule 15.06.2017