亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在不導致遞歸錯誤的情況下在基類中聲明子類對象?

如何在不導致遞歸錯誤的情況下在基類中聲明子類對象?

米琪卡哇伊 2021-06-26 16:18:22
我正在嘗試按如下方式構建 Python 3 程序:基類:身體子類:頭一個超簡單的代碼表示如下:class Body:    def __init__(self):        self.head_obj = Head()        # ...Set-up body...    def body_actions:        print('Body does something')class Head(Body):    def __init__(self):        super().__init__()        # ...Set-up head...    def head_actions:        print('Head does something')我希望能夠創建一個名為“body_obj”的 Body 實例,然后訪問 Head 子類(及其屬性/方法),如下所示:body_obj = Body()body_obj.body_actions()body_obj.head_obj.head_actions()但是,當我運行代碼時,Python 返回最大遞歸深度 RuntimeError。我需要在 Body 和 Head 類中使用 __ init __ 進行一些設置,當我不在 Head 類的 __ init __ 中調用 super() 函數時,Pycharm 會抱怨,因為這似乎是不好的做法。建立這種結構的正確方法是什么,在實例化基類時,類的子對象都需要初始化?我已經研究過嵌套類,但這似乎也是不好的做法。
查看完整描述

1 回答

?
偶然的你

TA貢獻1841條經驗 獲得超3個贊

頭部不是一種身體,它是身體的一部分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__()你實例化 a 時Body,它在你的實現中創建了 a 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()


查看完整回答
反對 回復 2021-06-29
  • 1 回答
  • 0 關注
  • 123 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號