【发布时间】:2018-11-06 09:23:13
【问题描述】:
我今天已经搜索了几个小时,但没有得到最近且令人满意的明确答案。
假设我们有两个特定的类,它们具有重叠的方法名称和特定的单独方法。摆脱不必要的部分让我们使用以下类。
class A():
def __init__(self, a_arg1, a_arg2):
self.a_arg1 = a_arg1
self.a_arg2 = a_arg2
@property
def gimme_1(self):
return self.a_arg1
@property
def gimme_2(self):
return self.a_arg2
@property
def prop(self):
return 'A'
还有
class B():
def __init__(self, b_arg1, b_arg2, b_arg3):
self.b_arg1 = b_arg1
self.b_arg2 = b_arg2
self.b_arg3 = b_arg3
@property
def give_1(self):
return self.b_arg1
@property
def give_2(self):
return self.b_arg2
@property
def give_3(self):
return self.b_arg3
@property
def prop(self):
return 'B'
我的目标是制作第三个类,它可以演变成其中之一,即,它将具有这两个类所具有的所有方法,并且无论请求哪一个,它都好像它是其中之一。这就是问题标题的动机。
class C(A, B):
def __init__(self, some_list):
self.some_list = some_list
@property
def gimme_1(self):
return self.some_list[0]
@property
def gimme_2(self):
return self.some_list[1]
@property
def give_1(self):
return self.some_list[0] ** 2
@property
def give_2(self):
return self.some_list[1] ** 2
@property
def give_3(self):
return self.some_list[2]
@property
def prop(self):
return 'C'
具体问题:
- 我们是否必须为此特定实例初始化父级?如果是,应该如何使用
super()。 - 这真的可以帮助我摆脱
isinstance(x, A)或isinstance(x, B)类型的查询。是否有任何最佳实践不鼓励这种用法?请注意,在我的情况下,Pythonic 鸭子类型对我来说真的不那么相关。对于不同的计算算法,必然会发生很多分支。因此,我实际上将类用作数据捆绑容器,但没有将它们用作状态记录器。换句话说,他们的实例数据几乎没有变化。但是他们的数据根据他们所在的类别在不同的分支中使用。因此,获得合适的对象对我来说至关重要。
【问题讨论】:
-
你是什么意思“变成其中之一”?它是这两者。是的,您应该使用
super来确保在子类化时调用所有相关方法。或者,如果您实际上不希望它成为子类,为什么要进行子类化? -
@jonrsharpe 如果您询问
A或B具有的任何方法,来自C,它会按照A或B的方式进行响应。即使我已经覆盖了所有方法,我还需要调用 super 吗? -
鸭子类型意味着你不关心对象是否是/子类,只是它具有相关属性。目前尚不清楚您实际上想要实现什么,但您可能不需要继承。你真的尝试过这些吗?发生了什么?
-
@jonrsharpe 看看问题 2。你是什么意思?这是我简化的一个实际问题。我不知道要注意什么。这就是我问的原因
标签: python python-3.x class multiple-inheritance