Как передать в метод __init__ другой метод в качестве атрибута?

Как правильно в метод инит передать функцию(метод) gen, генерирующую объект типа матрица.

    def __init__(self, rows, columns, g = gen()):
        self.rows = rows
        self.columns = columns
        self.gen = gen()
    def gen():
        yield (0,0,1)
        yield (0,1,2)
        yield (1,0,1)
      

Ответы (2 шт):

Автор решения: Алексей Белкин
class Sample():
    def __init__(self, rows, columns):
        self.rows = rows
        self.columns = columns
        self.gen = self.gen()
    
    
    def gen(self):
        yield (0, 0, 1)
        yield (0, 1, 2)
        yield (1, 0, 1)

f_Sample = Sample(1,2)
for i in f_Sample.gen:
    print(i)

Выдаст:

(0, 0, 1)
(0, 1, 2)
(1, 0, 1)
→ Ссылка
Автор решения: gil9red

Генератор, что передается в конструктор попадает в специальное поле и если значение поля задано, то возвращается его значения, иначе те, что были добавлены по-умолчанию

Пример:

from typing import Generator


class Foo:
    def __init__(self, rows, columns, g: Generator = None):
        self.rows = rows
        self.columns = columns
        self._inner_gen = g

    def gen(self):
        if self._inner_gen is not None:
            yield from self._inner_gen

        else:
            yield 0, 0, 1
            yield 0, 1, 2
            yield 1, 0, 1


print(list(Foo(3, 3).gen()))
# [(0, 0, 1), (0, 1, 2), (1, 0, 1)]

print(list(Foo(3, 3, g=((i,) * 3 for i in range(3))).gen()))
# [(0, 0, 0), (1, 1, 1), (2, 2, 2)]

def my_gen():
    yield 3, 3, 3
    yield 2, 2, 2
    yield 1, 1, 1
print(list(Foo(3, 3, g=my_gen()).gen()))
# [(3, 3, 3), (2, 2, 2), (1, 1, 1)]
→ Ссылка