代码之家  ›  专栏  ›  技术社区  ›  Boris Gorelik

封装与继承,帮助做出选择

  •  1
  • Boris Gorelik  · 技术社区  · 16 年前

    我需要为几种不同的案例类型编写处理程序(在python中)。所有这些类型的接口都是相同的,但是处理逻辑是不同的。

    一个选项是定义一个公共类,该类将特定的处理程序类型作为一个初始化参数接收:

    class Handler:
       def __init__ (self, handlerType):
           self._handlerType = handlerType
           self._handler = handlerType.handleStuff
    
       def handleStuff(self, *args, **kwargs):
           return self._handler(args, kwargs)
    
    
    # case specific handlers
    
    class Handler_Case1:
       def handleStuff(self, *args, **kwargs):
           print 'Handling Case 1'
    
    
    class Handler_Case2:
       def handleStuff(self, *args, **kwargs):
           print 'Handling Case 2'
    
    
    
    if __name__ == '__main__':
       handlers = []
       handlers.append(Handler(Handler_Case1))
       handlers.append(Handler(Handler_Case2))
       for h in handlers:
           h.handleStuff()
    

    但是,这会导致类型错误:

    typeerror:必须以handler\case1实例作为第一个参数调用未绑定的方法handlestuff()(改为获取元组实例)

    另一个选项是模拟抽象函数,如图所示 here (“Q:你能用0行代码在Python中实现抽象类吗?”):

    class Handler:
      def handleStuff(self, *args, **kwargs): abstract
      def commonFunction(self):
           print 'Common function'
    
    
     # case specific handlers
    
     class Handler_Case1(Handler):
      def handleStuff(self, *args, **kwargs):
          print 'Handling Case 1'
    
    
     class Handler_Case2(Handler):
      def handleStuff(self, *args, **kwargs):
          print 'Handling Case 2'
    
    
    
     if __name__ == '__main__':
      handlers = []
      h1 = (Handler_Case1())
      h2 = (Handler_Case2())
      handlers.append(h1)
      handlers.append(h2)
      for h in handlers:
          h.handleStuff()
          print
    

    所以,实际上,我有两个问题:

    1. 这两种方法中哪一种更像蟒蛇? 和
    2. 如何实施第一个?
    1 回复  |  直到 16 年前
        1
  •  4
  •   mipadi    16 年前

    我可能在你的问题中遗漏了一些微妙的复杂之处,但以你的第一个例子来看,是什么阻止了你这样做:

    class HandlerCase1(object):
        def handle_stuff(self, *args, **kwargs):
            print "Handling case 1"
    
    
    class HandlerCase2(object):
        def handle_stuff(self, *args, **kwargs):
            print "Handling case 2"
    
    
    if __name__ == "__main__":
        handlers = []
        handlers.append(HandlerCase1())
        handlers.append(HandlerCase2())
        for h in handlers:
            h.handle_stuff()
    

    如果您希望这些类共享一些公共(基本)功能,是否有什么东西阻止您这样做:

    class Handler(object):
        def common_function(self):
            print "Common function"
    
    
    class HandlerCase1(Handler):
        def handle_stuff(self, *args, **kwargs):
            print "Handling case 1"
    
    
    class HandlerCase2(Handler):
        def handle_stuff(self, *args, **kwargs):
            print "Handling case 2"
    
    
    if __name__ == "__main__":
        handlers = []
        handlers.append(HandlerCase1())
        handlers.append(HandlerCase2())
        for h in handlers:
            h.handle_stuff()
            h.common_function()