Как сделать начальный атрибут класса пустым списком?

316 просмотра
0
0 Комментариев

Суть проблемы:

>>> class A(object):
...     value = []
...     def method(self, new_value)
...         self.value.append(new_value)
...
>>> a = A()
>>> a.value
[]
>>> a.method(1)
>>> b = A()
>>> b.value
[1]
>>> b.method(2)
>>> b.value
[1, 2]
>>> a.value
[1, 2]

Это мне каждый раз в __init__ обнулять value? Так:

def __init__(self):
    self.value = []

Не очень удобно.


Добавить комментарий

2 Answers

Python Опубликовано 14.12.2018
0

Это мне каждый раз в init обнулять value? Так:

def init(self): self.value = []

Именно. Грубо говоря value — это список, который разделяют все объекты класса A. Что бы у каждого объекта класса он был свой, его нужно создать в конструкторе. Правда не уверен (давно не писал на питоне), может быть атрибуту объекта класса нужно дать имя, отличное от атрибута класса, например self_value.

Не очень удобно.

Почему? Вы напишете это один раз, а дальше этот код будет выполняться автоматом при каждом создании объекта класса.

Добавить комментарий
0

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

Определитесь, что вам именно нужно.

def __init__(self):
     self.value = []

создает атрибут объекта, поэтому value = [] писать не нужно. Т. е. это не «обнуление», это создание атрибута для экземпляра класса при инициализации.

Если же вам нужен общий для всех экземпляров класса список, пишите value = [] — без обнуления в __init__.


UPD после комментария. Тогда что-то вроде:

class My(object):
    initial = [1, 2, 3]
    def __init__(self):
        # копируем в экземпляр объекта
        self.initial = self.__class__.initial
 
...
 
# меняем атрибут класса
My.initial = [3, 2, 1]

Добавить комментарий
Напишите свой ответ на данный вопрос.
Scroll Up