簡體   English   中英

Python-選擇要繼承的類

[英]Python - Choose which class to inherit

我要創建兩個類A和B,其中B是A的微小但重要的變化,然后創建可以繼承A或B並為其添加功能的第三個類C。 問題是,如何根據自己的喜好告訴C繼承A或B?

為了使事情更清楚,假設我有以下代碼:

class A:

   def __init__(self, x, y):
       self.x = x
       self.y = y

   def first(self):
       return do_something(1)

   def second(self):
       return do_something(2)

   def third(self):
       return do_something(3)

   def start(self):
       self.first()
       self.second()
       self.third()

class B(A):

    def __init__(self, x, y, z):
        super().__init__(x, y)
        self.z = z

    def second(self):
        super().second()
        do_stuff()

    def third(self):
        do_other_stuff()

那是我使用的代碼的非常簡化的版本。 特別地,A代表制造系統的仿真器,而B代表相同制造系統的仿真器,其具有對主要機床的行為的修改。

現在,我想要添加代碼以計算一些統計信息。 它所做的是這樣的:

class C(A):

    def __init__(self, *args):
        super().__init__(*args)
        self.stat = 0

    def second(self):
        super().second()
        self.stat += 1

    def third(self):
        super().third()
        self.stat *= 3

問題是,無論我繼承類A(如上一清單)還是類B(代碼完全相同,並且作為第一行class C(B): ,類C的工作方式都完全相同class C(B):

我怎樣才能做到這一點? 還是我使用的是不可行的方式? 我認為理想的解決方案是在初始化C時能夠選擇繼承哪個類,即A或B。或者也許能夠將要繼承的類傳遞給C類。

我做了一些研究,也發現了聚合的可能性(我以前不知道),但是我並不認為它真的有用。 最后一點,請注意,類A可能有多達20至30個方法,並且當我使用類CI時,希望類A(或B,取決於它繼承的類)能夠像以前一樣正常工作,並且在兩者之間添加了C塊。

PS我正在尋找一種可能優雅,沒有代碼過多的“ pythonic”方法。 我也非常期待關於您認為可以做得更好的所有事情的建議。 最后,我可以完全修改類C,但是類A和B必須保持相同(除了小的更改)。

您可以使用新型類及其方法解析順序

考慮以下定義:

class A(object):
    def __init__(self, x):
        pass

    def foo(self):
        print "A"

class B(object):
    def __init__(self, x, y):
        pass

    def foo(self):
        print "B"

您可以構建一個mixin以向AB添加功能:

class Cmix(object):
    def foo(self):
        super(Cmix, self).foo()
        print "mix"

並分別繼承自CmixA (或B ):

class CA(Cmix, A):
    pass

class CB(Cmix, B):
    pass

最后,您可以編寫一個便捷函數,根據參數數量在CACB之間進行選擇:

def C(*args):
    if len(args) == 1:
        return CA(*args)
    else:
        return CB(*args)

現在我們有

C(1).foo()
# A
# mix
C(1, 2).foo()
# B
# mix

請注意, C不是真正的類,例如,您不能將其用作isinstance的第二個參數。

暫無
暫無

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

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