Разница заключается не в типе объекта, а в том, что ваш код делает с ним.
Существует большая разница между этими двумя:
self.tricks = trick
и:
self.tricks.append(trick)
Первый self.tricks = trick
присваивает значение атрибуту tricks
из self
.
Второй self.tricks.append(trick)
возвращает self.tricks
и вызывает для него метод (который здесь изменяет свои значения).
Проблема, в вашем случае, заключается в том, что в экземпляре self
не определено tricks
, поэтому self.tricks.append
получает атрибут tricks
класс и изменяет его, но self.tricks = ...
создает вместо него новый атрибут self
.
Тот факт, что один из них является строкой, а другой - списком, на самом деле не имеет значения.Было бы то же самое, если бы оба были списками. Обратите внимание, что они не могут быть обеими строками, поскольку строки неизменяемы и, следовательно, не имеют метода добавления
Как это исправить?
Это неправильно:
def add_trick(self, trick):
self.tricks = trick
Если tricks
является атрибутом класса, add_trick
должен быть методом класса:
@classmethod
def add_trick(cls, trick):
cls.tricks = trick
Если есть причины для add_trick
быть методом экземпляра, то просто сделайте это:
def add_trick(self, trick):
DogStr.tricks = trick