我的Python知识有限,在以下情况下我需要一些帮助。
假设我有两个类A
和B
,是否可以在Python中执行以下(概念性)操作:
import os
if os.name == 'nt':
class newClass(A):
# class body
else:
class newClass(B):
# class body
所以问题是我想创建一个类newClass
,这样它会根据平台差异从不同的基类继承,这可以用Python做吗?
感谢。
答案 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