动态选择继承的类

时间:2013-07-11 17:33:24

标签: python class inheritance

我的Python知识有限,在以下情况下我需要一些帮助。

假设我有两个类AB,是否可以在Python中执行以下(概念性)操作:

import os
if os.name == 'nt':
    class newClass(A):
       # class body
else:
   class newClass(B):
       # class body

所以问题是我想创建一个类newClass,这样它会根据平台差异从不同的基类继承,这可以用Python做吗? 感谢。

5 个答案:

答案 0 :(得分:63)

您可以使用conditional expression

class newClass(A if os.name == 'nt' else B):
    ...

答案 1 :(得分:12)

是的,你可以做你写的。虽然就个人而言,我可能会这样做以保持清洁:

class _newClassNT(A):
    # class body

class _newClassOther(B):
    # class body

newClass = _newClassNT if os.name == 'nt' else _newClassOther

这假设你需要在类体中实际执行不同的事情。如果您需要更改继承,您可以在那里嵌入if语句:

class newClass(A if os.name == 'nt' else B):
    # class body

答案 2 :(得分:4)

来自Java和C#的世界,做这样的事情的想法让我感到畏缩= P. (并不是说有条件地继承一个类的想法很糟糕 - 我只是不习惯它。)

稍微考虑一下,如果这个问题是关于Java的话,我会做这样的事情。我发布模式 - 实现一个接口,然后使用工厂在实现之间进行选择 - 以便为问题提供另一个视角:

public interface OsDependent {
  public void doOsDependentStuff();
}

public class WindowsDependentComponent implements OsDependent {
  @Override
  public void doOsDependentStuff() {
    //snip
  }
}

public class AppleDependentComponent implements OsDependent {
  @Override
  public void doOsDependentStuff() {
    //snip
  }
}

public class OsDependentComponentFactory {
  public OsDependent getOsDependentComponent(Platform platform) {
    if(platform == Platform.WINDOWS)
      return new WindowsDependentComponent();
    else if(platform == Platform.APPLE)
      return new AppleDependentComponent();
    else
      return null;
  }
}

绝对需要更多代码,但在强类型环境中这是一个合适的解决方案。


编辑:我在答案与原始问题之间注意到一个显着差异:

如果您有条件地从多个不同的类继承,那么超类包含依赖于您正在使用的操作系统的代码,而从它们继承的类包含的代码对于所有操作系统都是相同的。继承链的顶部是依赖于操作系统的;底部不是。

我的方法是另一种方式。 OsDepndent接口(或超类)定义了所有平台类似的方法,而不同的实现(或子类)具有依赖于操作系统的代码。继承链的顶层是与操作系统无关的。

答案 3 :(得分:2)

当你有两个以上的选项可供选择时,我找到了自己动态继承类的方法。我确信其他人在我之前使用过这个,但是我无法在网上找到这样的东西,因此我认为我应该与你分享。

SignatureUtils

此代码可以更改,您可以使用它进行完全分配。这是我最喜欢的设置动态类继承的方法,即使它有点长,因为你可以拥有任意数量的选项,甚至可以为每个对象提供多个动态选择的继承。

答案 4 :(得分:1)

对于那些在使用不同模块时有类似需求的人。 首先,创建一个文件switcher.py并在其中加入以下内容

class Switcher():
    def choose(clname):
         Switcher.clname = clname

接下来,在您的newClass.py放置

import switcher

class newClass(switcher.Switcher.clname):
    ...

最后在您的主脚本中

import switcher
import os
    if os.name == 'nt':
        switcher.Switcher.choose(A):
    else:
        switcher.Switcher.choose(B):

# that's the moment you're creating class with desired inheritance
import newClass.newClass