2015-06-01 3 views
0

У меня болит голова, пытаясь понять циклические отношения, которые выходят между типом metaclass, классом object и типом class.python metaclass, класс типа и класс объекта

Я пытаюсь понять, как python делает все объектом. Это потому, что все это экземпляр типа метакласса, или это потому, что все является подклассом класса объектов.

Если его из-за того, что он является подклассом класса объектов, означает ли это, если объект класса был назван классом pyobj. Значит ли это, что все в Python начинается с pyobj?

Я знаю, что объекты, созданные метаклассом, являются типами/классами, которые затем используются для создания другого объекта.

Отсюда:

>>> isinstance(type, object) 
True 
>>> isinstance(object,type) 
True 
>>> issubclass(object,type) 
False 
>>> issubclass(type,object) 
True 

ли с уверенностью сказать, что питон создает объект класса первого использования типа метакласса (я упрощая метакласс для краткости).

type('object',(),{}) 

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

Затем он создает тип класса:

type('type', (object,),{}) 

подразумевающего класс типа класс типа класса, и он наследует атрибуты класса объекта.

Затем создает другие классы путем наследования от объекта класса

type('dict', (object,), {}) 
type('Animal', (object), {}) 

, который похож на создание класса животных, как:

class Animal: 
    pass 

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

Какой тип используется, это тип метакласса или класс типа, который был создан после создания объекта?

В чем заключается тип класса, созданный с использованием объекта базового класса?

Я также пытался понять, что на самом деле происходит между объектом и классом из всех он ответов выше, и в этой статье http://www.cafepy.com/article/python_types_and_objects/python_types_and_objects.html

Я до сих пор путаюсь. Какова связь между этим двумя классами с точки зрения создания объекта?

Смогу ли я когда-нибудь получить это или это ситуация с курицей и яйцом?

+0

Вы прочитали [3.3.3. Настройка создания класса] (https://docs.python.org/3/reference/datamodel.html#customizing-class-creation) справочника по языку? – wwii

ответ

1

Основные типы Python действительно имеют ситуацию с курицей и яйцом. type наследует от object, но object является примером type.

Вы не можете действительно рассуждать о том, какой из object или type определен сначала в Python, потому что в регулярном коде Python вы не можете установить свои отношения. Интерпретатор Python позволяет это делать, возившись с внутренними элементами до того, как среда настроена, поэтому не имеет значения, если типы не полностью определены спереди.

В вашем примере, где вы называете type создавать новые object и type типов, вы на самом деле не получаете объекты, которые эквивалентны реальный type и object, в качестве нового object типа является экземпляром встроенного type метакласса, а не ручной работы type метакласс, который вы создаете позже.

Вот иллюстрация примерно того, как об этом говорит интерпретатор. Код на самом деле не работает, поскольку вы не можете создать класс нового стиля без наследования с object, а также не можете переназначить атрибутобъекта __class__ (сделать object экземпляром type). Если бы вы могли, вы могли бы запустить свою собственную независимую систему типов!

my_object = type('my_object',(), {}) # this doesn't work right, it inherits from object 
my_type = type('my_type', (my_object,), {}) 
my_object.__class__ = my_type  # this doesn't work at all (it will raise an exception) 
Смежные вопросы