Почему атрибут class запоминается?

Вот пример модуля python:

# foo.py class Foo(object): a = {} def __init__(self): print self.a self.filla() def filla(self): for i in range(10): self.a[str(i)] = i 

то я делаю это в оболочке python:

 $ python Python 2.7.2 (default, Jan 13 2012, 17:11:09) [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> from foo import Foo >>> f = Foo() {} >>> f = Foo() {'1': 1, '0': 0, '3': 3, '2': 2, '5': 5, '4': 4, '7': 7, '6': 6, '9': 9, '8': 8} 

Почему второй раз a не пуст? Я пропустил что-то тривиальное.

3 Solutions collect form web for “Почему атрибут class запоминается?”

Проблема в том, что a не связано. Это свойство класса, а не объекта. Вы хотите сделать что-то вроде этого:

 # foo.py class Foo(object): def __init__(self): self.a = {} print self.a self.filla() def filla(self): for i in range(10): self.a[str(i)] = i 

Это атрибут класса, а не экземпляр, и создается, когда класс определен, а не когда он создается.

Для сравнения:

 class Foo(object): def __init__(self): self.a = {} print self.a self.filla() def filla(self): for i in range(10): self.a[str(i)] = i 

Любая переменная get, установленная в _ init_ method, будет «локальной переменной».

 class Foo(object): def __init__(self): self.a = 'local' #this is a local varable >>> f = Foo() >>> fa 'local' >>> Foo.a AttributeError: type object 'Foo' has no attribute 'a' 

Любая переменная вне метода _ init_ будет «статической переменной».

 class Foo(object): a = 'static' #this is a static varable def __init__(self): #any code except 'set value to a' >>> f = Foo() >>> fa 'static' >>> Foo.a 'static' 

Если вы хотите определить «локальная переменная» и «статическая переменная»,

 class Foo(object): a = 'static' #this is a static varable def __init__(self): self.a = 'local' #this is a local variable >>> f = Foo() >>> fa 'local' >>> Foo.a 'static' 

Чтобы получить статическое значение внутри метода _ init_ , используйте self. _ класс _ .a

 class Foo(object): a = 'static' #this is a static varable def __init__(self): self.a = 'local' #this is a local variable self.__class__.a = 'new static' #access static value >>> f = Foo() >>> fa 'local' >>> Foo.a 'new static' 
  • В Python, как я могу ссылаться на класс в общем статическом ключе, например на ключевое слово PHP?
  • Не может быть функция как атрибут класса в Python
  • Как перезаписать импортированный класс python для всех вызовов
  • Python: __str__, но для класса, а не для экземпляра?
  • список обновлен в классе
  • Как сделать итерируемый класс в Python, в котором разрешен только определенный тип?
  • Python TypeError: объект 'str' не может быть вызван для класса
  • Использовать другой класс для входа пользователя в Django
  • Могу ли я предоставить метод класса Python в качестве параметра?
  • Как правильно создать класс утилиты
  • Есть ли причина использовать классы в Python, если в программе есть только один класс?
  •  
    Interesting Posts for Van-Lav

    Каков самый простой способ создания пустой итерации с использованием yield в Python?

    Как я могу видеть инструкции print () в behave (BDD)

    Патч __call__ функции

    Итерировать вложенный словарь в Python

    Как добавить двунаправленные многоточие в django admin?

    Есть ли какие-либо хорошие структуры построения, написанные на Python?

    в чем разница между возвратом и перерывом в python?

    Измените цвет всех пикселей на другой цвет

    Python не может получить форму с urllib или механизировать

    Как правильно использовать Правила, ограничивать_xpaths для обхода и анализа URL-адресов с помощью scrapy?

    AUTH_USER_MODEL относится к модели .., которая не была установлена ​​и создана. Модели AbstractUser не могут войти в систему

    Как я могу подавить новую строку после заявления печати?

    Есть ли лучший способ (помимо COM) для дистанционного управления Excel?

    Django Gunicorn не загружает статические файлы

    Рисунок imshow () слишком мал

    Python - лучший язык программирования в мире.