Применение декоратора к каждому методу в классе?

У меня есть декоратор @login_testuser относившийся метод test_1():

class TestCase(object):
    @login_testuser
    def test_1(self):
        print "test_1()"

Есть ли способ, которым я могу подать заявку @login_testuser на каждом методе класса, снабженного префиксом "test_"?

Другими словами, декоратор обратился бы test_1(), test_2() методы ниже, но не на setUp().

class TestCase(object):
    def setUp(self):
        pass

    def test_1(self):
        print "test_1()"

    def test_2(self):
        print "test_2()"
15
задан martineau 3 October 2019 в 21:48
поделиться

4 ответа

В Python 2.6, декоратор класса - это определенно то, что нужно. Например, вот довольно общий для такого рода задач:

import inspect

def decallmethods(decorator, prefix='test_'):
  def dectheclass(cls):
    for name, m in inspect.getmembers(cls, inspect.ismethod):
      if name.startswith(prefix):
        setattr(cls, name, decorator(m))
    return cls
  return dectheclass

и теперь, просто

@decallmethods(login_testuser)
class TestCase(object):
    def setUp(self):
        pass

    def test_1(self):
        print "test_1()"

    def test_2(self):
        print "test_2()"

получит то, что вы хотите. В Python 2. 5 или хуже, синтаксис @decallmethods не работает для украшения классов, но в остальном точно такой же код вы можете заменить следующим утверждением сразу после конца утверждения class TestCase:

TestCase = decallmethods(login_testuser)(TestCase)
21
ответ дан 1 December 2019 в 02:37
поделиться

Конечно. Перебрать все атрибуты класса. Убедитесь, что каждый из них является методом и начинается ли его имя с «test_». Затем замените его функцией, возвращенной вашим декоратором

Примерно так:

from inspect import ismethod, getmembers
for name, obj in getmembers(TestCase, ismethod):
   if name.startswith("test_"):
       setattr(TestCase, name, login_testuser(obj))
3
ответ дан 1 December 2019 в 02:37
поделиться

Сначала найдите во всех процессах процесс, который вы хотите убить, а не убейте его.

Process[] runningProcesses = Process.GetProcesses();
foreach (Process process in runningProcesses)
{
    // now check the modules of the process
    foreach (ProcessModule module in process.Modules)
    {
        if (module.FileName.Equals("MyProcess.exe"))
        {
            process.Kill();
        }
    }
}
-121--231428-

javascript не изменяет способ проводки значений? Если вы не можете получить доступ к значениям через PHP, как обычно, через $ _ POST ['name _ of _ input _ goes _ here']

edit: вы всегда можете выгрузить содержимое $ _ POST, чтобы увидеть, что вы получаете из формы javascript с помощью print _ r ($ _ POST) . Это даст вам представление о том, что вам нужно сделать в PHP, чтобы получить доступ к нужным данным.

-121--4605299-

Да, можно закольцовывать dir / __ dict __ класса или использовать метакласс, определяющий, начинаются ли атрибуты с «test». Однако это создаст менее простой, явный код, чем явное написание декоратора.

0
ответ дан 1 December 2019 в 02:37
поделиться

Вы уверены, что было бы лучше, если вместо этого поместили код login_testuser в setUp? Для этого и предназначен setUp: он запускается перед каждым методом тестирования.

3
ответ дан 1 December 2019 в 02:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: