[英]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.