2017-02-21 2 views
4

Рассмотрим следующий код:Класс наследования

class A(object): 
    a = [] 

    @classmethod 
    def eat(cls, func): 
     print "called", func 
     cls.a.append(func) 


class B(A): 
    @A.eat 
    def apple(self, x): 
     print x 

    A.eat(lambda x: x + 1) 


print A.a 

Выход: called <function apple at 0x1048fba28> called <function <lambda> at 0x1048fbaa0> [<function apple at 0x1048fba28>, <function <lambda> at 0x1048fbaa0>]

Я ожидал A.a быть пустым, как мы даже не создали object.How являются 2 функция получения сюда добавить, что именно вызывает eat, чтобы называться 2 раз?

+2

Все инструкции в классе выполняются при загрузке класса, например. 'class A: print ('hello')' будет печатать «привет» при загрузке класса. Оба '@ A.eat' и' A.eat() 'выполняются при загрузке класса, даже без' print A.a' вы получите первые 2 печатных выхода. – AChampion

ответ

5

, так как class definition is an executable statement.

Любой код внутри тела класса (но вне определений функций) будет выполняться во время выполнения.

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

Обратите внимание, что some tutorials получить это неправильно, что, несомненно, добавляет к путанице:

код не запускается, когда вы определяете класс - вы просто сделать функции и переменные.

Это просто неправильно.

5

Определение класса тела выполняется, когда модуль импортируется.

И это также означает, что декоратор также выполнен, передавая объект функции apple на A.eat, а затем привязывая возвращаемое значение к имени функции, которую вы передали (apple).

Вы можете прочитать больше о модели выполнения Пайтона здесь: https://docs.python.org/2/reference/executionmodel.html

Смежные вопросы