Голова - это не вид тела, это часть тела AFAIK.
Так что вы должны использовать состав вместо наследование :
class Head:
def __init__(self):
# ...Set-up head...
def head_actions():
print('Head does something')
class Body:
def __init__(self):
self.head = Head()
# ...Set-up body...
def body_actions:
print('Body does something')
Теперь вы можете сделать:
body = Body()
body.body_actions()
body.head.head_actions()
Причина, по которой вы получаете бесконечную рекурсию, заключается в том, что ваш Body
является суперклассом Head
, поэтому, когда вы вызываете super().__init__()
, вы создаете экземпляр Body
, который в вашей реализации создает Head
, который вызывает super().__init__()
и так далее.
Композиция (если это то, что вы подразумеваете под «вложением») - это не плохая практика, это стандартная практика и часто имеет больше смысла, чем наследование.
Редактировать в ответ накомментарий
Для доступа к методам Body
из Head
вы можете передать ссылку на Body
при создании.Поэтому переопределите классы следующим образом:
class Head:
def __init__(self, body):
self.body = body
def head_actions():
print('Head does something')
class Body:
def __init__(self):
self.head = Head(self)
def body_actions:
print('Body does something')
Теперь вы можете получить доступ к голове из тела, а тело из головы:
body = Body()
head = body.head
head.body.body_actions()
Или даже
body.head.body.body_actions()