Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-如何更改此设计?_Python - Fatal编程技术网

Python-如何更改此设计?

Python-如何更改此设计?,python,Python,我有一个用户对象的方法列表,定义如下: METHOD_ATTACK: { 'func': User.handle_attack, ... } 在处理这些行为时,我这样称呼: user.handle_action(ACTION, *args) 这样做的目的是,在方法*字典中存在各种控制参数,这些参数抽象了对不同功能的控制,例如,哪些参数要求用户处于特定状态以允许操作继续。handle\u action在调用action方法执行操作之前检查这些条件(如果一切都通过) 现在:我想创

我有一个用户对象的方法列表,定义如下:

METHOD_ATTACK: {
    'func': User.handle_attack,
    ...
}
在处理这些行为时,我这样称呼:

user.handle_action(ACTION, *args)
这样做的目的是,在方法*字典中存在各种控制参数,这些参数抽象了对不同功能的控制,例如,哪些参数要求用户处于特定状态以允许操作继续。handle\u action在调用action方法执行操作之前检查这些条件(如果一切都通过)

现在:我想创建第二种类型的用户,并重写派生类中的一些方法,因此我想调用SpecialUser.handle\u攻击,而不是User.handle\u攻击(如果存在的话)

一个选择是:

METHOD_ATTACK: {
    'func': "handle_attack",
    ...
}

...

func = getattr(user, ACTION["func"])
这将添加一个额外的getattr调用来查找每个操作

另一个选择是复制SpecialUser的所有方法,但这感觉是多余的


什么样的设计最适合这种变化?

一个常见的习惯用法是将它们作为类中的方法,并带有前缀

class User(object):
    def action_attack(self):
        ...

    def handle_action(self, name):
        method = getattr(self, 'action_' + name)
        method()

class SpecialUser(User):
    def action_attack(self):
        ...

顺便说一下,面向对象编程意味着对象知道它们的状态并根据消息进行操作;通过将控件置于对象之外,实际上是在破坏这种机制。因此,只需检查用户方法中的正确状态即可。即使在字典中描述了这些状态,也要在对象中检查它们。

一个常见的习惯用法是将它们作为类中的方法,并带有前缀

class User(object):
    def action_attack(self):
        ...

    def handle_action(self, name):
        method = getattr(self, 'action_' + name)
        method()

class SpecialUser(User):
    def action_attack(self):
        ...

顺便说一下,面向对象编程意味着对象知道它们的状态并根据消息进行操作;通过将控件置于对象之外,实际上是在破坏这种机制。因此,只需检查用户方法中的正确状态即可。即使在字典中描述了状态,也要在对象中检查它们。

为什么要创建自己的对象系统?我对操作有很多限制,发现在字典中总结这些限制要比在每个操作方法中写出它们更容易。啊,还有,getattr也没有那么昂贵,这在python中经常发生。为什么要创建自己的对象系统呢?我对操作有很多限制,并且发现在字典中总结这些限制要比在每个操作方法中写出它们更容易。啊,还有,getattr没有那么昂贵,它在python中经常发生。