开发者社区> 问答> 正文

在实例化类时动态选择继承?

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)
在这个例子中,我有classA并且classB都实现了一个common()输出不同值的函数。我希望classC继承其中一个类,这些类的workflow()行为会略有不同,具体取决于common()它继承的方法。这样做的主要目标是使用一种workflow()方法,其中self.common()更改的结果取决于继承。

如何classC在实例化时选择继承的类classC?

展开
收起
一码平川MACHEL 2019-02-28 11:28:27 3294 0
3 条回答
写回答
取消 提交回答
  • 二楼正解

    2019-09-09 14:34:56
    赞同 展开评论 打赏
  • 北京新抗元 绝望中的希望

    一楼正解

    2019-08-02 15:17:37
    赞同 展开评论 打赏
  • 要执行任务,请执行以下操作:

    获取列名列表:

    cc = df.columns
    创建分组映射。目标列会C0,C1...:

    grp = { cc[i] : 'C' + str(i // 5) for i in range(len(cc)) }
    定义加入功能(的系列转换INT到的系列STR和将它们连接起来:

    def myJoin(x):

    return ''.join(x.astype(str).values)

    最后,执行您的加入:

    df.groupby(grp, axis=1).agg(lambda x: myJoin(x))
    出于演示目的,我创建了测试DataFrame:

    D1-7 D1-8 D1-9 D1-10 D1-11 D2-7 D2-8 D2-9 D2-10 D2-11
    0 1 2 3 4 5 6 7 8 9 0
    1 0 1 2 3 4 5 6 7 8 9
    结果是:

      C0     C1

    0 12345 67890
    1 01234 56789


    您不能为单个对象选择不同的父类; 类处理继承。也就是说,您可以直接使用按需创建新类type。你不会使用classC直接,但一个子类,从两者继承classC和适当的一个classA和classB,治疗两成混合式课程。

    a = type("pick-a-name", (classC, classA), {})()
    b = type("pick-a-name", (classC, classB), {})()
    你会注意到这里有一个额外的开销,因为每次你尝试实例化一个对象时,你必须先创建一个新类。您也可以立即定义子类。

    class Ca(classC, classA):

    pass
    

    class Cb(classC, classB):

    pass
    2019-07-17 23:29:39
    赞同 1 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
继承与功能组合 立即下载
建立联系方法之一 立即下载
JAVA反射原理以及一些常见的应用 立即下载