如何写出更好的python继承方式?

时间:2016-09-06 13:17:21

标签: python inheritance

我写过这个,

class Sp():
  def __init__(self):
    self.price = 1
class A(Sp):
  def __init__(self):
    super(A, self).__init__()
    self.test = True
class B(A):
  pass
class C(A):
  pass
class D(A):
  """In this class I don't want to inherit Sp class, but need A class"""
  def __init__(self):
     super(D, self).__init__()
     self.me = 'ok'
     self.list_ = [Sp()]

Sp A 的Parent类。我在 B C D 中使用 A 类,但 D < / strong>不需要Sp继承,而是需要 D 中的 Sp 实例对象(请查看 D 类)。我想在 D 中停止 Sp 继承,有没有什么好办法写这个?

1 个答案:

答案 0 :(得分:0)

如果A本身继承自Sp,则不能继承A而不继承Sp。你可以尝试解决这个问题,方法是让A继承两个类,其中一个实现非Sp行为(比如称之为Abits),{{1 (Sp)。然后让class A(Abits, Sp):B继承C,而A仅从D继承。

如果不需要单独创建Abits,则可以让A完全不从A继承,并Sp和{{1} }继承自BCA),而Sp仅继承自class B(A, Sp):,这样就无需单独D

最后,您可以考虑构图。让A不从任何内容继承,只包含Abits的实例。然后使用the __getattr__ special method获取D上未定义的A属性:

A

如果您需要改变D实例,则可能还需要使用class D(object): # Explicitly inheriting from object not needed on Py3 def __init__(self, ...): self.a = A(...) def __getattr__(self, name): # Only called when attribute "name" doesn't exist on instance of D return getattr(self.a, name) 。这比较棘手(因为__setattr__被无条件地调用,而不仅仅是当一个属性不存在时),但是如果你搜索,有很多使用它的例子。