我试图做的东西沿着这些路线:Python的设计:面向对象
class A:
def __init__(self, x=None, y=None):
self.x = x
self.y = y
class B(A):
def do_something_in_Bs_context(self):
print "In B"
class C(A):
def do_something_in_Cs_context(self):
print "In C"
a = A(1,2)
b = B.do_something_in_Bs_context(a)
c = C.do_something_in_Cs_context(a)
正如所预期的这个代码将产生此错误:
TypeError: unbound method do_something_in_Bs_context() must be called with B instance as first argument (got A instance instead)
这个设计的根本原因是,是数据的容器(比如一个表),B和C是A上的一组操作.B和C都运行在相同的数据上,但在概念上是一组不同的操作,可以在同一个数据上执行。我可以将A和B内的所有操作分开,但是我想在概念上创建分离。 (作为一个例子,在一张桌子上,我可以执行不同的操作集合,这些操作集合成微积分或者三角函数,所以A:表格B:微积分C:红外光谱)
这让我想起Model-视图 - 控制器范例略有扭曲。
我想出了以下解决方案:
- B和C是这样实现的概念上不同的类(一个 视图/控制器),其保持到A的实例的引用和 在该实例上进行操作。
- 由于关于A B和C只组一起 方法,创建具有功能上A.
的 实例进行操作的模块,我不喜欢这两种解决方案的多(2略好于1 ),但是我不确定是否有更好的/更清洁/更pythonic的方式来解决这个问题。任何指针?
我不知道我们展示点的类型错误是,所以我忽略了它在我的答案。 –
1&2似乎完全习惯用法。如果您只想将几个功能组合在一起,请不要创建课程。 – delnan