【问题标题】:Subclassing two classes in Python? [closed]在 Python 中继承两个类? [关闭]
【发布时间】:2020-12-30 16:08:35
【问题描述】:

我在 Python 中有以下类继承:

A
|
B--D
|  |
C  E

困扰我的是,我在 C 和 E 中有很多重复的类方法。如果我将 E 设为 C 而不是 D 的子级,则可以避免这种情况,但是我必须在 E 中复制 D 的方法。

有没有办法让 E 继承 D 和 C 以使 E 具有 C 和 D 的功能?

【问题讨论】:

  • class E(C,D):...?
  • 是的,Python 允许多重继承。
  • 或将共享代码移动到另一个类中并从中派生出两个类
  • @SibbsGambling 搜索MRO,即方法解析顺序
  • 如果你使用super每个类都应该使用super。每个单独类的__init__ 方法的调用顺序取决于最终的方法解析顺序。

标签: python


【解决方案1】:

您可以进行多重继承。当你实现它时,你有很多可能性,所以这取决于你的需求。

例如:

class E(C, D):
   pass

看看这个: https://www.programiz.com/python-programming/multiple-inheritance

【讨论】:

    【解决方案2】:

    你可以同时继承两个类:

    class a(b, c):
        pass
    

    因此,如果在 b 中,thing1 = 123,在 c 中,thing2 = 64,a 将同时具有这两个变量。

    >>> a.thing1
    123
    >>> a.thing2
    64
    

    但是如果a类是这样的:

    class a(b, c):
        thing3 = 42
    

    使用dir(a),在大列表的末尾会出现:

    'thing1', 'thing2', 'thing3'
    

    因此,您可以这样做:

    >>> a.thing3
    42
    

    但不是这个(我假设):

    >>> c.thing3
    

    【讨论】:

      【解决方案3】:

      你当然可以。查看此资源https://pythonprogramminglanguage.com/multiple-inheritance/#:~:text=In%20Python%20a%20class%20can,concept%20from%20object%20orientated%20programming

      class A:
          pass
      
      class B(A):
          pass
      
      class C(B):
          pass
      
      class D(B):
          pass
      
      class E(C, D):
          pass
      

      【讨论】:

        【解决方案4】:

        你可以像下面这样子类化多个类

        class C:
           pass
        class D:
           pass
        class E(C, D):
           pass
        
        

        您甚至可以创建一个 mixin(它只是一个不能单独使用的类)并将常用功能放在那里,然后将该 mixin 添加到需要这些功能的类中。

        What is a mixin, and why are they useful?

        【讨论】:

          【解决方案5】:

          其中一种解决方案是将C和E中重复的方法提取到一个新的类F中,让C和E继承自F。在大多数情况下,它被称为Mixin。查看这个答案以获得更多解释:https://stackoverflow.com/a/547714/3421655

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-09-04
            • 2015-04-09
            相关资源
            最近更新 更多