Я импортировал пакет, который предоставляет мне класс и функцию-обертку, которая создает экземпляр этого класса. Например:
class Foo:
def __init__(self, a, b):
self.a = a
self.b = b
def print_a(self):
print(self.a)
def print_b(self):
print(self.b)
def makeFoo(x, y):
a = x + y
b = x - y
return Foo(a, b)
Я хочу иметь подобный класс NamedFoo
, который имеет те же свойства / методы, также имеет свойство name и имеет конструктор, который вызывает makeFoo
. Я полагаю, что это должно быть решено с использованием наследования, при этом NamedFoo
является подклассом Foo
. Однако я не знаю, как заставить конструктор NamedFoo
правильно использовать makeFoo
:
class NamedFoo(Foo):
def __init__(self, x, y, name):
# ???
# Foo = makeFoo(x, y) ??
# self.Foo = makeFoo(x, y) ??
self.name = name
def printName(self):
print(self.name)
Пример данных:
myNamedFoo = NamedFoo(2,5,"first")
myNamedFoo.print_a() # (From makeFoo: a = x + y) ==> 2 + 5 = 7
myNamedFoo.print_b() # (From makeFoo: a = x - y) ==> 2 - 5 = -3
Я не слишком знаком с объектомориентированное на программирование, так что я могу просто использовать неправильные условия поиска, но я не нашел ничего похожего на то, что мне нужно. Возможно ли это, и если да, то как я могу это сделать?
Я также не уверен, является ли это проблемой X / Y, но вот альтернативы, которые я рассмотрел, и почему я не думаю,они идеальны:
- Состав
Foo
и свойство name
: Это уродливо и не кажется правильным. - Вручную добавить свойство
name
к каждому Foo
объекту и, возможно, обернуть его в функцию: не совсем элегантно, как конструктор с одним вкладышем. - Переписать конструктор для класса
Foo
, чтобы тот же код, что и в makeFoo
: makeFoo
, довольно сложный и требует большой настройки, и это в любом случае привело бы кдля дублирования кода