Как передать в метод __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)]