Python:继承父类的方法而不是类的子类

时间:2016-01-28 00:46:36

标签: python

我似乎无法找到有关我正在尝试做什么的信息,因此我担心答案是“你做不到”或“这是不好的做法”。但是,在这里:

鉴于以下内容:

Class A(object):
  def __init__(self):
    pass
  def methoda(self):
    return 1

Class C(object):
  def __init__(self):
    pass
  def methodc(self):
    return 2

import A, C
Class B(object):
  def __init__(self, classC):
    A.__init__(self)
      if classC:
         C.__init__(self)
  def methodb(self):
    return 2

显然,跑步:

b = A() 
b.methoda()

会因错误而崩溃:

Unbound method __init()___ must be called with A class as first argument (got B instance instead)

但是,我基本上在寻找一种方法来完成这项工作。我的动机:

有些类(可能在将来)会复制某组方法(比如一些奇特的转换)。为了减少代码,我希望将来的类继承方法;但由于遗留原因,我不希望B继承C。

2 个答案:

答案 0 :(得分:1)

一对解决方案:

不要直接使用特殊方法:

class A(object):
    def __init__(self):
        self._init(self)
    @staticmethod
    def _init(self):
        ...actual initialization code here...
    def methoda(self):
        return 1

class C(object):
    def __init__(self):
        self._init(self)
    @staticmethod
    def _init(self):
        ...actual initialization code here...
    def methodc(self):
        return 2

import A, C
class B(object):
    def __init__(self, classC):
        A._init(self)
        if classC:
            C._init(self)
    def methodb(self):
        return 2

或涉及从初始化对象复制的愚蠢黑客:

import A, C
class B(object):
    def __init__(self, classC):
        vars(self).update(vars(A()))
        if classC:
            vars(self).update(vars(C()))
    def methodb(self):
        return 2

请注意,这些解决方案都无法在A的实例上访问CB的方法。那只是丑陋的。如果你真的需要继承,使用继承,不要尝试很难模拟它。

答案 1 :(得分:0)

我最终只是继承了多个类。这不完全是我想要的方式,但它更干净,更容易让IDE遵循

Class A(object):
  def __init__(self):
    super(A, self).__init__()
    pass
  def methoda(self):
    return 1

Class C(object):
  def __init__(self):
    super(C, self).__init__()
  def _C_init(self):
    # some init stuff
    pass
  def methodc(self):
    return 1

Class B(A, C):
  def __init__(self, use_C):
    super(B, self).__init__()
    if use_C:
      self._C_init()
  def methodb(self):
    return 2