Python设计:OOP

Gen*_*cos 4 python oop inheritance

我试图沿着这些方向做点什么:

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 )
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,此代码将生成此错误:

TypeError: unbound method do_something_in_Bs_context() must be called with B instance as first argument (got A instance instead)
Run Code Online (Sandbox Code Playgroud)

这种设计的根本原因是A是数据的容器(比如表),B和C是A上的一组操作.B和C都在相同的数据上运行,但在概念上是一组独特的操作,可以对相同的数据执行.我可以将A和B中的所有操作联合起来,但我想在概念中创建分离.(例如,在表格中,我可以执行不同的操作集合,可以分组为"微积分"或"三角函数".所以A:表,B:微积分,C:Trignometry)

这让我想起了模型 - 视图 - 控制器范例,略有不同.

我想出了以下解决方案:

  1. B和C实现为概念上不同的类(视图/控制器),它们维护对A实例的引用并对该实例进行操作.
  2. 由于B和C只是将A上的方法组合在一起,因此创建具有在A实例上运行的函数的模块.

我不喜欢这些解决方案中的任何一个(2稍微好于1),但后来我不确定是否有更好/更清洁/更pythonic的方法来解决这个问题.有什么指针吗?

Mat*_*ick 6

以下是我理解这个问题的方法: B并且C是使用类型数据的函数集合A.你想要做的是逻辑地分组功能.

我建议做以下其中一项:

  1. 将函数分成几个类B,C并且运行在A-s上 - 这是一个HAS-A关系.如果你需要的话,函数/方法可以是静态的
  2. 将功能分成模块,BC创建顶级功能定义

我认为继承对这个问题来说是一个糟糕的解决方案.我不认为有IS-A关系.

  • 同意,虽然我认为具有函数的模块比静态方法更像Pythonic. (3认同)