Почему атрибут 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' 
  • Идиоматически преобразовывать объект BaseClass в объект SubClass?
  • Почему идентификатор класса Python не уникален при вызове быстро?
  • Pythonic: использование __dict__ в функции self .__ init__ класса
  • Как создать собственный класс в Python
  • вложенные классы в Python
  • Новичок Python, имеющий проблемы с использованием классов
  • Классы Python без использования def __init __ (self)
  • Как создать пользовательское строковое представление для объекта класса?
  • Python - лучший язык программирования в мире.