我有一个用户对象的方法列表,定义如下:
METHOD_ATTACK: {
'func': User.handle_attack,
...
}
在处理这些动作时,我这样称呼:
user.handle_action(ACTION, *args)
这样做的目的是在 METHOD_* 字典中有各种控制参数,这些参数抽象了对不同功能的控制,例如哪些要求用户处于特定状态才能允许操作继续。如果一切顺利,handle_action 在调用操作方法执行操作之前检查这些条件。
现在:我想创建第二种类型的用户并在派生类中覆盖其中的一些方法,所以如果存在的话,我想调用 SpecialUser.handle_attack 而不是 User.handle_attack。
一种选择是:
METHOD_ATTACK: {
'func': "handle_attack",
...
}
...
func = getattr(user, ACTION["func"])
这增加了一个额外的 getattr 调用来查找每个操作。
另一种选择是为 SpecialUser 复制所有 METHOD_*,但这感觉是多余的。
哪种设计最适合这种变化?