복붙노트

[PYTHON] 클래스의 메소드에 파이썬 장식자를 적용하기

PYTHON

클래스의 메소드에 파이썬 장식자를 적용하기

데코레이터 @login_testuser가 test_1 메소드에 대해 적용되었습니다.

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

"test_"접두어가 붙은 클래스의 모든 메소드에 @login_testuser를 적용 할 수있는 방법이 있습니까?

즉, 아래의 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()"

해결법

  1. ==============================

    1.파이썬 2.6에서, 클래스 데코레이터는 분명히 갈 길입니다. 예를 들어, 다음은 이러한 종류의 작업에 대한 일반적인 일반적인 예입니다.

    파이썬 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()"
    

    당신이 원하는 것을 얻을 것입니다. 파이썬 2.5 또는 그 이하의 경우 @decallmethods 구문은 클래스 장식용으로 작동하지 않지만, 완전히 똑같은 코드를 사용하면 TestCase 클래스 종료 직후에 다음 문으로 바꿀 수 있습니다.

    TestCase = decallmethods(login_testuser)(TestCase)
    
  2. ==============================

    2.확실한. 클래스의 모든 속성을 반복합니다. 각각의 메소드를 확인하고 이름이 "test_"로 시작하는지 확인하십시오. 그런 다음 데코레이터에서 반환 된 함수로 바꿉니다.

    확실한. 클래스의 모든 속성을 반복합니다. 각각의 메소드를 확인하고 이름이 "test_"로 시작하는지 확인하십시오. 그런 다음 데코레이터에서 반환 된 함수로 바꿉니다.

    같은 것 :

    from inspect import ismethod, getmembers
    for name, obj in getmembers(TestCase, ismethod):
       if name.startswith("test_"):
           setattr(TestCase, name, login_testuser(obj))
    
  3. ==============================

    3.대신에 login_testuser의 코드를 setUp에 넣는 것이 더 나아지지 않을 것이라고 확신합니까? 그것이 setUp의 목적입니다. 모든 테스트 방법 이전에 실행됩니다.

    대신에 login_testuser의 코드를 setUp에 넣는 것이 더 나아지지 않을 것이라고 확신합니까? 그것이 setUp의 목적입니다. 모든 테스트 방법 이전에 실행됩니다.

  4. ==============================

    4.예, 클래스의 dir / __ dict__를 반복하거나 metaclass를 사용하여 속성이 "test"로 시작하는지 식별 할 수 있습니다. 그러나 이렇게하면 데코레이터를 명시 적으로 작성하는 것보다 덜 명확하고 명확한 코드가 작성됩니다.

    예, 클래스의 dir / __ dict__를 반복하거나 metaclass를 사용하여 속성이 "test"로 시작하는지 식별 할 수 있습니다. 그러나 이렇게하면 데코레이터를 명시 적으로 작성하는 것보다 덜 명확하고 명확한 코드가 작성됩니다.

  5. from https://stackoverflow.com/questions/2237624/applying-python-decorators-to-methods-in-a-class by cc-by-sa and MIT license