簡體   English   中英

Python:在基類的方法中初始化新的派生類

[英]Python: Initialising a new derived class in a method of a base class

我的情況是我可以訪問兩個可以很好地協同工作的類。 大規模修改其代碼可能是不可能的,但也許可以實現一些小的更改。 但是,我想對這兩個類進行一些小的擴展。 從每個類派生並添加功能,這似乎是子類化的工作。 但是我遇到了一個問題,因為一個基類調用了另一個基類,而不是我的派生類。

假設我在模塊“ base_classes.py”中有兩個類A和B。 類B具有創建類A的實例並使用它的方法,例如

'base_classes.py'

class A():
    def __init__(self):
        print('Class A being called')

class B():
    def __init__(self):
        self.do_thing()
    def do_thing(self):
        self.myA = A() # Here class A is explicitly named

因此,我想對這兩個子類進行繼承並擴展它們。 我在一個單獨的模塊中執行此操作:

'extensions.py'

import base_classes

class DerivedA(base_classes.A):
    def __init__(self):
        super().__init__()
        print('Class DerivedA being called')

class DerivedB(base_classes.B):
    pass

db = DerivedB()

如預期的那樣,輸出只是

Class A being called  

但是,如何防止我的B子類在方法do_thing(self)成為A基類的實例,而成為DerivedA的實例呢?

最簡單的方法是在DerivedB中重寫do_thing(self) ,以便它顯式調用DerivedA,例如

class DerivedB(base_classes.B):
    def do_thing(self):
        self.myA = DerivedA() # Here class DerivedA is explicitly named

對於這個小示例來說,這很好,但是如果do_thing(self)長一百行並且包含許多A類型的對象怎么辦? 如果B中的大多數方法都包含一些A對象怎么辦。 您基本上必須使用幾乎完全相同的副本來覆蓋每個方法,從而一開始就毫無意義地從B派生出來。 就我而言,這幾乎就是問題,我認為必須有一個聰明的pythonic方法來解決這個問題。 理想情況下,無需完全重寫原始類。

有任何想法嗎?

您可以在類B上更改do_thing方法,並在參數中傳遞一個類:

class B():
    def __init__(self):
        self.do_thing()
    def do_thing(self, klass=A):
        self.myA = klass()

然后generateB do_thing方法可以用DerivedA調用它

class DerivedB(base_classes.B):
    def do_thing(self, klass=DerivedA):
        return super(DerivedB, self).do_thing(klass)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM