какой шаблон дизайна для pre-do в функции класса - PullRequest
2 голосов
/ 11 января 2012

Моей функции класса всегда нужно сделать что-то подобное (Python):

class X:
 def f1():
  #### 
  if check() == False: 
   return;
  set_A()
  ####
  f1_do_something

 def f2():
  #### 
  if check() == False: 
   return;
  set_A()
  ####

  f2_do_something

И я хочу:

class X:
 def f1():
  # auto check-return-set_A()
  f1_do_something

 def f2():
  # auto check-return-set_A() 
  f2_do_something

Я читал о шаблонах проектирования и не знаю, как применять шаблоны проектирования в этом случае. Если нет подходящих шаблонов проектирования, есть ли другое решение этой проблемы?

1 Ответ

5 голосов
/ 11 января 2012

Вы можете использовать декоратор :

#!/usr/bin/env python

def check(f, *args, **kwargs):
    def inner(*args, **kwargs):
        print 'checking...'
        return f(*args, **kwargs)
    return inner

class Example(object):

    @check
    def hello(self):
        print 'inside hello'

    @check
    def hi(self):
        print 'inside hi'

if __name__ == '__main__':
    example = Example()
    example.hello()
    example.hi()

Этот фрагмент будет печатать:

checking...
inside hello
checking...
inside hi

Если вы идете по этому маршруту, пожалуйста, проверьте functools.wrap, который сообщает декораторам имя исходной функции и документацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...