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

1 投票
1 回答
747 浏览
提问于 2025-04-15 11:06

我需要为几种不同的情况类型编写处理程序(用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()

不过,这样会导致一个类型错误:

类型错误:未绑定的方法 handleStuff() 必须用 Handler_Case1 实例作为第一个参数调用(而不是元组实例)

另一种选择是模仿抽象函数,像这里展示的那样 (问:你能在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. 这两种方法中哪种更符合Python的风格?
  2. 如何实现第一种方法?

1 个回答

4

我可能没有完全理解你问题中的某些细节,不过根据你给的第一个例子,是什么阻止你这样做呢:

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()

撰写回答