r1 = Row()
r1.cells = generator_1(3)
Ну во-первых, это выглядит скорее как обычная переменная, а не как поле класса. Будь это хотя бы вида
r1 = Row(table, 3) # 3я строка таблицы table
, это имело бы смысл
Во-вторых, что за "восход солнца вручную"?
for i in range(5): # нам нужно знать длину строки?
cell_val = next(r1.cells, None)
print (cell_val)
Почему не сделать
for cell_val in r1:
print (cell_val)
если генераторы по определению заточены под итерацию по ним.
В-третьих, реализация cut_value откровенно неудачная - это должно быть property. Сейчас, если value изменится, cut_value уже не будет ему соответствовать. Придётся помнить, что нужно изменять и то, и то.
Ну и главное - генераторы одноразовые! Тебе придётся явно перезадавать их после использования, что убивает весь смысл.
В целом, я бы сказал, что ты не понимаешь главную идею того, зачем вообще наворачивают подпрограммы, классы и прочие
абстракции: спрятать сложность реализации за простым интерфейсом. Классом должно быть проще пользоваться, чем переписать его с нуля. В приведённом коде это не так.
Вообще, если тебе интересно, как организовать массив - посмотри в сторону numpy. Там очень удобно сделана работа с массивами, и даже небольшого подмножества фич будет достаточно. В общем-то, возникает вопрос, а так ли нужны отдельные классы Row и Column.