繁体   English   中英

Python-选择要继承的类

[英]Python - Choose which class to inherit

我要创建两个类A和B,其中B是A的微小但重要的变化,然后创建可以继承A或B并为其添加功能的第三个类C。 问题是,如何根据自己的喜好告诉C继承A或B?

为了使事情更清楚,假设我有以下代码:

class A:

   def __init__(self, x, y):
       self.x = x
       self.y = y

   def first(self):
       return do_something(1)

   def second(self):
       return do_something(2)

   def third(self):
       return do_something(3)

   def start(self):
       self.first()
       self.second()
       self.third()

class B(A):

    def __init__(self, x, y, z):
        super().__init__(x, y)
        self.z = z

    def second(self):
        super().second()
        do_stuff()

    def third(self):
        do_other_stuff()

那是我使用的代码的非常简化的版本。 特别地,A代表制造系统的仿真器,而B代表相同制造系统的仿真器,其具有对主要机床的行为的修改。

现在,我想要添加代码以计算一些统计信息。 它所做的是这样的:

class C(A):

    def __init__(self, *args):
        super().__init__(*args)
        self.stat = 0

    def second(self):
        super().second()
        self.stat += 1

    def third(self):
        super().third()
        self.stat *= 3

问题是,无论我继承类A(如上一清单)还是类B(代码完全相同,并且作为第一行class C(B): ,类C的工作方式都完全相同class C(B):

我怎样才能做到这一点? 还是我使用的是不可行的方式? 我认为理想的解决方案是在初始化C时能够选择继承哪个类,即A或B。或者也许能够将要继承的类传递给C类。

我做了一些研究,也发现了聚合的可能性(我以前不知道),但是我并不认为它真的有用。 最后一点,请注意,类A可能有多达20至30个方法,并且当我使用类CI时,希望类A(或B,取决于它继承的类)能够像以前一样正常工作,并且在两者之间添加了C块。

PS我正在寻找一种可能优雅,没有代码过多的“ pythonic”方法。 我也非常期待关于您认为可以做得更好的所有事情的建议。 最后,我可以完全修改类C,但是类A和B必须保持相同(除了小的更改)。

您可以使用新型类及其方法解析顺序

考虑以下定义:

class A(object):
    def __init__(self, x):
        pass

    def foo(self):
        print "A"

class B(object):
    def __init__(self, x, y):
        pass

    def foo(self):
        print "B"

您可以构建一个mixin以向AB添加功能:

class Cmix(object):
    def foo(self):
        super(Cmix, self).foo()
        print "mix"

并分别继承自CmixA (或B ):

class CA(Cmix, A):
    pass

class CB(Cmix, B):
    pass

最后,您可以编写一个便捷函数,根据参数数量在CACB之间进行选择:

def C(*args):
    if len(args) == 1:
        return CA(*args)
    else:
        return CB(*args)

现在我们有

C(1).foo()
# A
# mix
C(1, 2).foo()
# B
# mix

请注意, C不是真正的类,例如,您不能将其用作isinstance的第二个参数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM