2013-08-06 2 views
0

Давайте рассмотрим следующий пример:Когда Python создает объект класса в памяти?

>>> class Foo(object): 
...  pass 
... 

Мое текущее понимание, когда интерпретатор Python читает строки class Foo(object) [определение класса Foo], это создаст объект Foo класса в памяти.

Тогда я сделал следующие два теста:

>>> dir() 
['Foo', '__builtins__', '__doc__', '__name__', '__package__'] 

Это выглядит как интерпретатор Python хранит объект «Foo» класса в памяти.

>>> id(Foo) 
140608157395232 

кажется объект класса Foo находится по адресу памяти: 140608157395232.

ли мои рассуждения правильно? Если нет, то когда Python создает объект класса в памяти?

+1

Я не уверен, в чем ваш вопрос. Что вы подразумеваете под «когда»? – Blender

+0

Я имею в виду, когда интерпретатор Python создает объект класса? Каково инициирующее событие создания объекта класса? – Mingyu

ответ

5

Чтобы быть более конкретным, Python создает объект типа класса, когда он завершит обработку всех определение класса (так быть педантичным, он не будет создавать его, пока он был разобран и обработан pass линии, а также, в вашем пример).

Это, как правило, применяется только в эзотерических крайних случаях, как следующее:

>>> class Foo(object): 
...  print repr(Foo) 
... 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 2, in Foo 
NameError: name 'Foo' is not defined 

Но да, ваши рассуждения в общем, правильно.

+0

Спасибо, @Amber. Пример, который вы предоставили, просто к делу! – Mingyu

+0

Еще более конкретным: после определения конца определения класса класс создается путем вызова его метакласса, причем метаклассом по умолчанию является 'type'. Существует более подробная информация в http: // stackoverflow.com/questions/100003/what-is-a-metaclass-in-python – torek

1

Объект класса создается по линии class Foo(object):, да. Он не создается, когда он читает эту строку, однако, он создается, когда он достигает конца определения класса.

id данного класса не должен иметь никакого отношения к типу памяти. Это деталь реализации, и вы не используете ее.

+0

Спасибо, Леннарт. Документация Python говорит, что идентификатор CPython указывает адрес памяти. http://docs.python.org/2/library/functions.html#id. – Mingyu

+0

@Mingyu: Да, но это CPython. –

+0

Согласитесь ... «id» может быть или не быть адресом памяти зависит от реализации Python :-) – Mingyu

0

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

Создается экземпляр класса и выполняется class.__init__(), когда вы назначаете объект этого типа класса.

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

+0

Я думаю, что '__init__' - инициализировать переменные, а' __new__' - создавать экземпляр класса. – Mingyu

+0

Также обратите внимание, что назначение не имеет ничего общего с вызовом '__init__'. 'Foo()' самостоятельно по строке по-прежнему вызывает 'Foo .__ init__'. – Amber

+0

@Mingyu правильно, функция '__new__' создает экземпляр (в Python2 это часть того, почему вы пишете' class K (object) ', чтобы наследовать' object .__ new__', если вы не определяете свой собственный '__new__ '; в 3.x наследование-from -'object' неявно), а затем его функция' __init__' инициализирует его. Обратите внимание: если ваш '__new__' возвращает другой объект, это то, что вы получаете, например,' class K (object): def __new __ (cls): return 1' (indent правильно) и 'k = K()', Посмотрим, что 'k' является обычным' int' со значением 1. – torek