【发布时间】:2015-08-18 14:46:23
【问题描述】:
我正面临一个几乎教科书般的钻石继承问题。下面的(相当人为的!)示例捕获了它的所有基本特征:
# CAVEAT: error-checking omitted for simplicity
class top(object):
def __init__(self, matrix):
self.matrix = matrix # matrix must be non-empty and rectangular!
def foo(self):
'''Sum all matrix entries.'''
return sum([sum(row) for row in self.matrix])
class middle_0(top):
def foo(self):
'''Sum all matrix entries along (wrap-around) diagonal.'''
matrix = self.matrix
n = len(matrix[0])
return sum([row[i % n] for i, row in enumerate(matrix)])
class middle_1(top):
def __init__(self, m, n):
data = range(m * n)
matrix = [[1 + data[i * n + j] for j in range(n)] for i in range(m)]
super(middle_1, self).__init__(matrix)
总之,middle_0 和middle_1 类都是top 类的子类,其中middle_0 覆盖方法foo 和middle_1 覆盖方法__init__。基本上,经典的钻石继承设置。对基本模式的一种阐述是middle_1.__init__ 实际上调用了父类的__init__。 (下面的演示展示了这些类的实际应用。)
我想定义一个类bottom,它从middle_0“获取”1foo 和从middle_1 获取__init__。
实现这样一个bottom 类的“pythonic 方式”是什么?
演示:
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print top(matrix).foo()
# 45
print middle_0(matrix).foo()
# 15
print middle_1(3, 3).foo()
# 45
# print bottom(3, 3).foo()
# 15
1我写的是“gets”而不是“inherits”,因为我怀疑这个问题不能用标准的 Python 继承轻松解决。
【问题讨论】:
-
一个可以给你解释多继承顺序的博客:python-history.blogspot.de/2010/06/method-resolution-order.html
标签: python oop inheritance