Это потому, что вы обращаетесь к классу, а не к объекту этого типа.
Давайте попробуем это на минимальном примере:
class Container:
def __init__(self):
self._content = range(10)
@property
def content(self):
return self._content
@content.setter
def set_content(self, c):
self._content = c
Это работает:
c = Container()
for number in c.content:
print(number)
(распечатывает числа от 0 до 9).
Но это не удалось:
for number in Container.content:
print(number)
с ошибкой
TypeError Traceback (most recent call last)
<ipython-input-27-f1df89781355> in <module>()
1 # This doesn't:
----> 2 for number in Container.content:
3 print(number)
TypeError: 'property' object is not iterable
Помимо проблем со свойствами, вы не инициализировали объект, поэтому функция класса __init__
никогда не вызывалась, а Container._content
не инициализировалась.
На самом деле, у вас возникла бы аналогичная проблема, если бы вы только что использовали
class Container:
def __init__(self):
self.container = range(10)
(только в этом случае это будет ошибкой атрибута).
Конечная нота: это
for number in Container().content: # note the '()'!!
print(number)
снова работает, потому что мы создаем объект контейнера на лету.