封装与继承,帮助做出选择
我需要为几种不同的情况类型编写处理程序(用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
所以,实际上我有两个问题:
- 这两种方法中哪种更符合Python的风格?
- 如何实现第一种方法?
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()