2016-04-22 68 views
1

名爲MyClass的Base類存在於一個文件中,而另一個Base類MyClass1存在於另一個文件中。如何從兩個基類之一繼承,決定運行時

我有兩個平臺suse10和suse11 linux。我有一個腳本,基於平臺MyClass.py文件將被禁用suse10和MyClass1將被禁用suse11。

現在我想在另一個文件中的另一個類通用於這兩個平臺繼承基於平臺的這些類中的任何一個。我該怎麼辦呢

讓我們考慮MyClass.py是

class MyClass(AbsClass): 
    def __init__(self,Sample): 
     /*Constructor func*/ 

    /*Class Func*/ 

而且MyClass1.py是

class MyClass1(AbsClass): 
    def __init__(self,Sample): 
     /*Constructor func*/ 

    /*Class Func with some additional functionalities*/ 

我想SubClass.py文件

from MyClass import MyClass 
from MyClass1 import MyClass1 
class SubClass(MyClass or MyClass1 based on which is enabled): 
    def __init__(self,Sample): 
     MyClass.__init__(self,Sample): 

在腳本中

if PLATFORM==suse10 
    rm -r MyClass.py /* Deletes and disables it */ 
elif PLATFORM==suse11 
    rm -r MyClass1.py /* Deletes and disables it */ 

將此視爲一個抽象代碼。也考慮有100個平臺啓用和禁用python文件。我如何可以動態加載使用類的存在

+1

我們需要看到一些代碼,以確切地看到你正在嘗試做什麼。有可能比動態繼承樹更容易處理平臺差異。試着向我們展示一個[mcve] – snakecharmerb

+0

@snakecharmerb我已經添加了代碼。你可以檢查 – user2608755

回答

1

可以有條件地導入:

if is_suse10(): 
    from MyClass import MyClass as Base 
elif is_suse11(): 
    from MyClass1 import MyClass1 as Base 
else: 
    raise UnsupportedPlatformError() 

class SubClass(Base): 
    def __init__(self, Sample): 
     super(SubClass, self).__init__(Sample) 

注意,我們在調用的方式母公司__init__有點標新立異,所以我改變了這一點。

+0

Strogonoff,有沒有任何其他的方式有條件地使用檢查類名bcoz考慮有超過90個平臺啓用和禁用這些類 – user2608755

+0

''MyClass = importlib.import_module(platform_name).MyClass'' - https:/ /docs.python.org/2.7/library/importlib.html – Tony

+0

這將只爲所有平臺獲取MyClass。由於MyClass的不可用性,有些平臺會失敗。那麼MyClass1呢? – user2608755

2

您可以定義取決於平臺

if platform == 'Suse10': 
    class BaseClass: 
     ... 

elif platform == 'Suse11': 
    class BaseClass: 
     ... 
else: 
    raise Exception('Unexpected platform') 


class MyClass(BaseClass): 
    .... 

什麼更優雅這樣

class BaseClassSuse10: 
    ... 

class BaseClassSuse11: 
    ... 

if platform == 'Suse10': 
    BaseClass = BaseClassSuse10 
elif platform == 'Suse11': 
    BaseClass = BaseClassSuse11 
... 

MyClass(BaseClass): 
    ... 

或基類的類文件,如果您有一個模塊base.py,您可以在其中定義所有基類

if platform == 'Suse10': 
    from base import BaseClass10 as BaseClass 
elif platform == 'Suse11': 
    from base import BaseClass11 as BaseClass 
+0

第二個或第三個選項是我會推薦的(定義兩個類,然後分配一個特定的名稱在子類中使用/使用別名導入)。有條件的進口可能是最pythonic的路要走。 –