我写过这个,
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 继承,有没有什么好办法写这个?
答案 0 :(得分:0)
如果A
本身继承自Sp
,则不能继承A
而不继承Sp
。你可以尝试解决这个问题,方法是让A
继承两个类,其中一个实现非Sp
行为(比如称之为Abits
),{{1 (Sp
)。然后让class A(Abits, Sp):
和B
继承C
,而A
仅从D
继承。
如果不需要单独创建Abits
,则可以让A
完全不从A
继承,并Sp
和{{1} }继承自B
和C
(A
),而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__
被无条件地调用,而不仅仅是当一个属性不存在时),但是如果你搜索,有很多使用它的例子。