2016-06-27 3 views
0

인자로 클래스 장식자를 썼습니다. 이 데코레이터는 클래스 필드 ID의 값을 설정해야합니다. 나는 다음과 같은 방법으로 그 일을하고있다 :클래스 데코레이터 - 클래스 필드의 수정도 기본 클래스의 값 변경

기능 createTest에서
class Base: 
    ID = "ID_Base" 
    def __init__(self, n): 
     self.n = n 

    def func(self): 
     pass 

def Test(cnt): 
    def createTest(className): 
     class _Test(className): 
      def __init__(self, n): 
       className.__init__(self, n) 

      def func(self): 
       for n in range(cnt): 
        className.func(self) 

     name = className.__name__ + "_Test" 
     _Test.__name__ = name 
     globals()[name] = _Test 

     _Test.ID = className.ID + '_test' 
     className.ID = '' 
     return _Test 

    return createTest 

@Test(2) 
class Derived(Base): 
    pass 

print(Base.ID) 
print(Derived.ID) 
print(Derived_Test.ID) 

처음 그때 그때 새로운 _Test 클래스에 대한 클래스 이름을 수정하고 현재 모듈에서 글로벌 클래스로 등록, 지정된 클래스 형에서 파생 된 클래스의 정의가 (마지막 블록에서) _Test 클래스에 ID 속성을 설정하고 클래스의 ID을 매개 변수로 전달하고 새로운 유형을 반환합니다.

ID_Base 

ID_Base_test 

그러나 그것을 실행 한 후 나는 이것을보고

: :이 얻을 수있는 다음과 같은 결과를 한

ID_Base 
ID_Base_test 
ID_Base_test 

Derived 클래스 대신 _Test의 속성이 장식에서 만든 수정? 그리고 그것을 고치는 방법?

Python 2.6.6 (Linux) 및 Python 3.4.1 (Windows의 ActivePython)을 사용하여이 내용을 확인했습니다.

편집 : 나는 또한 다음과 같은 _Test 클래스의 내부 ID를 설정하려고했으나 같은 결과를 얻었다 :

def Test(cnt): 
    def createTest(className): 
     class _Test(className): 
      ID = className.ID + '_test' 
+0

Derived_Test는 어디에서 왔습니까? 그는 주석도 가지고 있나? –

+0

Derived_Test 이름이 라인 특히 장식에 생성된다 '이름 = 클래스 명 .__ name__ + "_test"'설명을 '_test .__ name__ = name' '전역() [이름] = _Test' –

답변

2

당신이 print(Derived.ID)에서 ID_Base_test있어 그 이유는 말에서 암시 적 과제 있다는 것입니다 꾸미기는 Derivedclass Derived_Test으로 참조합니다.

class Derived(Base): 
    pass 
Derived = Test(2)(Derived) 

에 코드 등호의

@Test(2) 
class Derived(Base): 
    pass 

종류 다음은 __main__.Derived_Test을 얻을 것이다, 꾸미는 후 print(Derived)을보십시오.

업데이트 : 자세한 설명은 this wiki을 참조하십시오.

데코레이터는 함수, 메소드 또는 클래스 정의를 수정하는 데 사용되는 호출 가능한 모든 Python 객체입니다. 데코레이터는 정의 된 원본 객체를 전달 받고 수정 된 객체 을 반환하며이 객체는 정의의 이름에 바인딩됩니다.

+0

감사, 이것은 의미가 있습니다. –

관련 문제