Python, наследование классов
Привет, стак. Столкнулся с такой проблемой, что не могу грамотно раскидать классы по отдельным .py файлам. По условию лабораторной необходимо создать несколько классов по принципу наследования, и одно из требований - каждый класс в отдельном файле. Также в основном классе необходимо создать метод, который будет создавать экземпляр дочернего класса, не могу догнать как верно это всё реализовать.
С импортом там вообще беда была, по итогу всё импортировало друг друга. Ошибки были по типу: "Имя не обнаружено" и "Невозможно импортировать"
Вот условие, в общем.
Написать программу, в которой описана иерархия классов: функция от одной переменной (арктангенс, арккотангенс, а также класс, необходимый для представления производных). Базовый класс должен иметь методы получения значения функции для данного значения переменной, а также создания экземпляра класса, представляющего собой производную текущего экземпляра. Продемонстрировать работу всех методов классов всех классов.
first.py
class A(): # базовый класс
def __init__(self, param1, param2):
...
def method_A(self):
obj_B = B(param1, param2) # Создание экземпляра дочернего класса.
return obj_B
second.py
class B(A): # арктангенс
...
third.py
class C(A): # арккотангенс
...
fourth.py
class D(): # Вообще это класс для производной, но не знаю от чего его наследовать.
...
Ответы (2 шт):
Как-то так, думаю:
a.py
class A:
def __init__(self, param):
self._dict = {
'B': B,
'C': C,
}
self.childs = []
self.param = param
def create_child(self, child, parameter):
self.childs.append(self._dict[child](parameter))
return self.childs[-1]
def get_child_var(self, child, var):
return child.__dict__.get(var)
if __name__ == '__main__':
from b import B
from c import C
b.py
from a import A
class B(A):
def __init__(self, degree):
self.degree = degree
def print(self):
print(self.degree)
c.py
from a import A
class C(A):
def __init__(self, degree):
self.degree = degree
def print(self):
print(self.degree)
и т.д.
Примеры вызовов:
a = A(10)
c = a.create_child('C', 5)
a.get_child_var(c, 'degree')
Работает, если запускать first.py
first.py
import second
class A: # базовый класс
def __init__(self, param1, param2):
self.param1 = param1
self.param2 = param2
def method_A(self):
obj_B = second.B(
self.param1, self.param2
) # Создание экземпляра дочернего класса.
return obj_B
if __name__ == "__main__":
import third
a = A(1, 2)
print("A", a)
b = second.B(1, 2)
print("B", b)
c = third.C(1, 2)
print("C", c)
second.py
from first import A
class B(A): # арктангенс
...
third.py
from first import A
class C(A): # арккотангенс
...