36

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

假设我有两个类,A并且B是否可以在 Python 中(从概念上)执行以下操作:

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

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

4

5 回答 5

72

您可以使用条件表达式

class newClass(A if os.name == 'nt' else B):
    ...
于 2013-07-11T17:35:25.690 回答
13

是的,你可以完全按照你写的去做。虽然就个人而言,我可能会这样做是为了清洁:

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
于 2013-07-11T17:36:26.117 回答
3

来自 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方法,而不同的实现(或子类)具有依赖于操作系统的代码。继承链的顶部与操作系统无关。

于 2013-07-11T20:39:03.717 回答
2

当您有两个以上的选项可供选择时,我找到了自己的动态继承类的方法。我相信其他人在我之前使用过这个,但是我在网上找不到这样的东西,所以我想我应该和你分享一下。

class A():
    # Class A Body
class B():
    # Class B Body
class C():
    # Class C Body
class D():
    # Class D Body
def MakeObject(InheritedClassName): # InheritedClassName is a string
    def CheckClass(InheritedClass):
        if InheritedClass == "A":
            return A
        elif InheritedClass == "B":
            return B
        elif InheritedClass == "C":
            return C
        else:
            return D
    class WantedClass(CheckClass(InheritedClassName)):
        # WantedClass Body
    YourObject = WantedClass()
    return YourObject
CreateObject = MakeObject(str(input("Chose A, B, C or D")))

这段代码可以修改,你可以用它做很多事情。这是我最喜欢的设置动态类继承的方式,尽管它有点长,因为您可以拥有任意数量的选项,甚至可以为每个对象动态选择多个继承。

于 2015-06-12T10:29:20.020 回答
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
于 2016-08-24T13:20:59.437 回答