2016-04-22 71 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的路要走。 –