【问题标题】:Dynamically pick inheritance when instantiating a class? [duplicate]实例化类时动态选择继承? [复制]
【发布时间】:2019-02-26 21:16:18
【问题描述】:
class classA:
    def common(self):
        print('A')

class classB:
    def common(self):
        print('B')

class classC:
    def workflow(self):
        print('Do something')
        self.common()
        print('Do something else')


A = classC() # Here I want to create classC that inherits from classA
A.workflow()
assert isinstance(A, classA)

B = classC() # Here I want to create classC that inherits from classB
B.workflow()
assert isinstance(B, classB)

在这个例子中,我有classAclassB,它们都实现了一个函数common(),它输出不同的值。我想让classC 从其中一个类继承,这样workflow() 的行为会略有不同,具体取决于它继承的common() 方法。这样做的主要目标是拥有一个workflow() 方法,其中self.common() 的结果根据继承而变化。

当我实例化classC 时,如何选择classC 从哪个类继承?

【问题讨论】:

    标签: python inheritance


    【解决方案1】:

    您不能为单个对象选择不同的父类; 处理继承。也就是说,您可以直接使用type 按需创建一个new 类。您不会直接使用classC,而是使用继承自classC 以及classAclassB 中相应的一个的子类,将两者视为混合类。

    a = type("pick-a-name", (classC, classA), {})()
    b = type("pick-a-name", (classC, classB), {})()
    

    你会注意到这里有一个额外的开销,每次你尝试实例化一个对象时,你必须首先创建一个新类。你还不如 立即定义子类。

    class Ca(classC, classA):
        pass
    
    class Cb(classC, classB):
        pass
    

    【讨论】:

      猜你喜欢
      • 2011-10-26
      • 2013-07-10
      • 2011-11-27
      • 1970-01-01
      • 2017-09-18
      • 1970-01-01
      • 2015-07-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多