Возможности в классе Python удивительное поведение - PullRequest
2 голосов
/ 13 апреля 2011

Следующий код приведет к выполнению оператора print

class C1(object):

    print 'I am some code executing in C1'

    def method1(self):
        print 'I am method1'
    def method2(self):
        print 'I am method2'
        pass

Я удивлен этим, так как думал, что он будет выполнен только в том случае, если будет создан экземпляр класса, может кто-нибудь объяснить причину этого?

Ответы [ 2 ]

8 голосов
/ 13 апреля 2011

Полагаю, вы имеете в виду, что он печатает «Я выполняю какой-то код в C1»?

Он печатается при создании объекта класса, и в этом случае это происходит, когда вы загружаете файл, в котором он объявлен. Это также место, где вы помещаете переменные класса (которые можно использовать как эквивалент Python для статических переменных в других языки).

Если вы хотите иметь код, который выполняется при создании экземпляра, поместите его в __init__().

Официальная документация Python по теме: http://docs.python.org/tutorial/classes.html#class-objects

2 голосов
/ 13 апреля 2011

В Python определение класса является исполняемым оператором.

Цитировать документацию :

7.7.Определения классов

Определение класса определяет объект класса (см. Раздел Иерархия стандартных типов):

classdef    ::=  "class" classname [inheritance] ":" suite
inheritance ::=  "(" [expression_list] ")"
classname   ::=  identifier

Определение класса является исполняемым оператором.Сначала он оценивает список наследования, если таковой имеется.Каждый элемент в списке наследования должен соответствовать объекту класса или типу класса, который позволяет создавать подклассы.Затем набор класса выполняется в новом фрейме выполнения (see section Именование и привязка), используя недавно созданное локальное пространство имен и исходное глобальное пространство имен.(Обычно набор содержит только определения функций.) Когда набор класса завершает выполнение, его кадр выполнения отбрасывается, но его локальное пространство имен сохраняется.[4] Объект класса затем создается с использованием списка наследования для базовых классов и сохраненного локального пространства имен для словаря атрибутов.Имя класса связано с этим объектом класса в исходном локальном пространстве имен.

Примечание программиста: переменные, определенные в определении класса, являются переменными класса;они являются общими для всех экземпляров.Чтобы создать переменные экземпляра, они могут быть установлены в методе с self.name = value.Переменные класса и экземпляра доступны через нотацию «self.name», а переменная экземпляра скрывает переменную класса с тем же именем при доступе таким способом.Переменные класса могут использоваться как значения по умолчанию для переменных экземпляра, но использование изменяемых значений может привести к неожиданным результатам.Для классов нового стиля дескрипторы могут использоваться для создания переменных экземпляра с различными деталями реализации.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...