Какой лучший способ обойти «статические переменные» в Python?

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

class Foo(): number = 0 def set(self): self.number = 1 >>> foo = Foo() >>> foo.number 0 >>> foo.set() >>> foo.number 1 >>> new_foo = Foo() >>> new_foo.number 1 

  • сделать словарь с дубликатными ключами в python
  • Поиск хорошей структуры данных дерева Python
  • Получение сетевой маски в Python
  • Должен ли __init __ () вызывать __init __ () родительского класса?
  • Почему моя функция, использующая время Python ограничена во входной величине magnatude?
  • Используйте `__dict__` или` vars () `?
  • Python - Как извлечь последние элементы x из списка
  • Как вы издеваетесь над сервисом пользователя в App Engine?
  • Как установить sys.argv, чтобы я мог его протестировать?
  • Почему pycharm предлагает изменить метод на статический
  • Получать уникальные значения из списка в python
  • Создание таблицы с данными csv
  • 3 Solutions collect form web for “Какой лучший способ обойти «статические переменные» в Python?”

    Переменные, определенные на уровне класса, действительно «статичны», но я не думаю, что они работают так, как вы думаете. Здесь есть 2 уровня, о которых вам нужно беспокоиться. На уровне класса есть атрибуты, и на уровне экземпляра есть атрибуты. Всякий раз, когда вы выполняете self.attribute = ... внутри метода, вы устанавливаете атрибут на уровне экземпляра. Всякий раз, когда python ищет атрибут, он сначала смотрит на уровень экземпляра, если он не находит атрибут, он смотрит на уровень класса.

    Это может быть немного запутанным (особенно если атрибут является ссылкой на изменяемый объект). рассматривать:

     class Foo(object): attr = [] #class level attribute is Mutable def __init__(self): # in the next line, self.attr references the class level attribute since # there is no instance level attribute (yet) self.attr.append('Hello') self.attr = [] # Now, we've created an instance level attribute, so further appends will # append to the instance level attribute, not the class level attribute. self.attr.append('World') a = Foo() print (a.attr) #['World'] print (Foo.attr) #['Hello'] b = Foo() print (b.attr) #['World'] print (Foo.attr) #['Hello', 'Hello'] 

    Как указывали другие, если вы хотите, чтобы атрибут был специфичным для экземпляра, просто инициализируйте его как атрибут экземпляра в __init__ (используя self.attr = ... ). __init__ – это специальный метод, который запускается всякий раз, когда инициализируется класс (за некоторыми исключениями, которые мы здесь не будем обсуждать).

    например

     class Foo(object): def __init__(self): self.attr = 0 

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

     class Foo(object): def __init__(self): self.number = 0 def set(self): self.number = 1 >>> foo = Foo() >>> foo.number 0 >>> foo.set() >>> foo.number 1 >>> new_foo = Foo() >>> new_foo.number 0 

    Изменить : заменить последнюю строку вышеприведенного фрагмента; он читал 1 хотя это была только опечатка на моей стороне. Похоже, это вызвало немало путаницы, когда я был в отъезде.

    Возможно, вы захотите изменить атрибут класса:

     class Foo(): number = 0 def set(self): Foo.number = 1 

    вместо того, чтобы переопределять это!

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