Разница между объектом и экземпляром в python?

Это происходит в python2.7

Я работаю над идеей метакласса в python, почти весь учебник ссылается на объект как экземпляр класса в python. Однако, играя с классом A(): формой определения класса, я увидел это:

class ClsDef1():
    pass
C1 = ClsDef1()
print C1
<__main__.ClsDef1 instance at 0x2aea518>

class ClsDef2(object):
    pass
C2 = ClsDef2()
print C2
<__main__.ClsDef2 object at 0x2ae68d0>

Это означает, что при создании экземпляра из класса, который не присущ объекту, экземпляр является экземпляром, но когда класс присущ объекту, экземпляр класса является объектом?

Может ли кто-нибудь объяснить разницу? В реальной жизни, которую я должен использовать?

Спасибо!

Ответы

Ответ 1

В этом разница между классами нового стиля и старого стиля, которые подробно описаны в в документации. В принципе, в Python 2.x вы должны обеспечить, чтобы вы всегда наследовали объект, чтобы получить класс нового стиля. В Python 3 классы старого стиля полностью исчезли.

Ответ 2

Короткий ответ: в python все объекты имеют тип (возвращаемый типом (x)), который также является объектом.
если 't' - объект типа, то его тип является специальным типом type. Итак (type (type (x)) type) всегда True. В старых классах пользовательский "класс" является объектом типа "classobj" , и каждый экземпляр любого класса является объектом типа "экземпляр". То есть существует два встроенных типа "classobj" и "instance", которые реализуют классы. Связь между экземпляром и его классом осуществляется через его член __class__.

С новыми классами: классы, определенные пользователем, представляют собой объекты нового типа (их тип - "тип", а не "classobj" ), и при создании экземпляров их тип() каждого экземпляра является объектом класса. Таким образом, объекты разных пользовательских классов теперь имеют разные типы. И классы находятся на том же уровне, что и все встроенные типы; со старыми классами существует отдельная структура типа instance- > class и object- > , новые классы используют тип object- > для обоих.

В документах гораздо больше, но это ядро.

Ответ 3

В отличие от двусмысленности между "классом" и "типом", "экземпляр" является синонимом "объекта". Подумайте об этом так: объекты - это экземпляры типов. Итак, "42 является экземпляром типа int" эквивалентен "42 является объектом int". Обычно я использую "экземпляр" и "объект" взаимозаменяемо.