Вопрос

Почему если я делаю:

class C(): pass
type(C())

Я получил: <type 'instance'>, но если я сделаю:

class C(object): pass
type(c())

Я получил: <class '__main__.c'> ?

Первый не очень пользователь

Это было полезно?

Решение

Посмотрите разницу между классами старого стиля и нового стиля. Первые по умолчанию, и последний наследует явно от объекта.

Все предметы старого стиля были реализованы со встроенным экземпляром типа. Тот факт, что они по-прежнему по умолчанию, и их тип остается «экземпляром» является результатом меры предосторожности ретро совместимости.

Это извлечено из документов Python (http://docsysython.org/reference/datamodel.html)

3.3. Классы нового стиля и классические классы и экземпляры приходят в двух ароматах: старый стиль (или классический) и новый стиль.

До питона 2.1 классы старого стиля были единственным вкусом для пользователя. Концепция класса (старого стиля) не связана с концепцией типа: если X - это экземпляр класса старого стиля, затем X.класс Обозначает класс X, но тип (х) всегда. Это отражает тот факт, что все экземпляры старости, независимо от их класса, реализуются с одним встроенным типом, называемым экземпляром.

Классы нового стиля были введены в Python 2.2 для унификации классов и типов. Класс нового стиля не является ни более, ни меньше, чем пользователь, определенный пользователем. Если X - это экземпляр класса нового стиля, то тип (X) обычно такой же, как X>.класс (Хотя это не гарантируется - экземпляр класса нового стиля разрешен для переопределения значения, возвращаемого для x.класс).

Основная мотивация для введения новых классов в стиле состоит в том, чтобы обеспечить единую модель объекта с полной метамоформой. Он также имеет ряд практических преимуществ, таких как возможность подкласса большинства встроенных типов или введение «дескрипторов», которые позволяют вычислить свойства.

Для соображений совместимости классы по умолчанию все еще старые стиль. Классы нового стиля создаются, указав другой класс нового стиля (т. Е. Тип) в качестве родительского класса или объект «Тип верхнего уровня», если ни один другой родитель не требуется. Поведение новых классов в новом стиле отличается от таковых классов старого стиля в ряде важных деталей в дополнение к тому, какой тип () возвращается. Некоторые из этих изменений являются основополагающими для новой модели объекта, подобно тому, как называются специальные методы. Другие являются «исправлениями», которые не могут быть реализованы ранее для озабоченности совместимости, такие как порядок разрешения метода в случае многократного наследования.

Хотя данное руководство направлено на обеспечение всестороннего покрытия механики класса Python, в некоторых районах все еще может отсутствовать в некоторых областях, когда речь идет о своем покрытии классов нового стиля. Пожалуйста, посмотри http://www.python.org/doc/newstyle/Для источников дополнительной информации.

Классы старого стиля удаляются в Python 3.0, оставляя только семантику новых классов в новом стиле.

Другие советы

Честно говоря, я не думаю, что короткий ответ здесь здесь. Советую вам начать читать о присоединении к Unificate / нового стиля типа Python:http://www.python.org/doc/newstyle/

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top