2013-08-15 3 views
1

У меня есть список методов моего пользовательского объекта, определяемый следующим образом:Python - Как изменить этот дизайн?

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, но это кажется излишним.

Какой дизайн лучше всего подходит для этого изменения?

+0

Почему вы создали свою собственную объектную систему? – Marcin

+0

У меня есть множество ограничений на действия, и было проще обобщить эти ограничения в словаре, чем написать их все в каждом методе действий. –

+0

Ах, также, getattr не так дорого, это происходит все время в python. –

ответ

4

Одной из распространенных идиом является их использование в качестве методов в классе с префиксом.

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): 
     ... 

К слову, объектно-ориентированное программирование означает, что объекты знают свое состояние и действуют на сообщения; имея элементы управления вне объектов, которые вы действительно нанесли на поражение этому механизму. Таким образом, просто выполняйте проверки правильного состояния в рамках методов пользователя. Даже если состояния описаны в словаре, а затем проверяйте их внутри объекта.

Смежные вопросы