2009-06-05 2 views
2

데코레이터를 초기화 할 클래스를 어떻게 찾습니까? 데코레이터가 아직 클래스에 묶여 있지 않기 때문에 이것을 발견 할 수 없다는 것이 합리적입니다 만, 이것을 얻는 방법이 있습니까?파이썬에서 초기화하는 동안 부모 클래스에 액세스하는 방법?

class A(object): 
    def dec(f): 
       # I am in class 'A' 
     def func(cls): 
      f(cls) 
     return func 

    @dec 
    def test(self): 
     pass 

필자는 어떤 클래스 (주석 처리 된 라인으로 표시되는지)를 알아야합니다.

+0

http://stackoverflow.com/questions/805066/how-to-call-a-parent-classs-method-from-child-class-in ( 후 초기화 클래스 생성자 사용) -python –

+0

질문 805066은 super()에 관한 것입니다. 어떻게 도움이되는지는 여기 보지 못합니다. – balpha

+0

예를 들어 말하면 주위에 방법이 없습니다. 그러나 왜 수업에 액세스해야하는지 더 자세하게 설명하면 더 나은 방법을 찾을 수 있습니다. –

답변

3

나는 이것이 가능하지 않다고 생각합니다. 테스트를 정의하는 바로 그 순간에 클래스는 아직 존재하지 않습니다.

파이썬이 발생

class A(object): 

그것이이 클래스 정의에서 찾은 모든 코드 (테스트 (의 정의 포함) 데코레이터에 대한 호출)를 실행하는 새로운 공간을 만들고, 때 완료되면 새 클래스 객체가 만들어지고 코드가 실행 된 후에 네임 스페이스에 남아있는 모든 클래스가이 클래스에 저장됩니다.

그래서 데코레이터가 호출되면 아무 것도 알지 못합니다. 이 순간 테스트는 단지 함수 일뿐입니다.

0

질문하지 않습니다.

>>> class A(object): 
    def dec(f): 
     def func(cls): 
      print cls 
     return func 

    @dec 
    def test(self): 
     pass 

>>> a=A() 
>>> a.test() 
<__main__.A object at 0x00C56330> 
>>> 

인수 (cls)는 A 클래스이다.

+0

그는 (어떤 이유로 든) func의 정의를 * 알기를 원합니다. – balpha

+0

클래스가 정의되기 전에 "알기"를 필요로하지 않으므로 질문을받지 못합니다. –

0

나디아 (Nadia)가 지적했듯이 좀 더 구체적으로 설명해야합니다. 파이썬은 이런 종류의 일을 허용하지 않습니다. 이것은 당신이하려는 일이 아마도 잘못된 것임을 의미합니다.

그동안, 선원과 개구리에 관한 저의 저의 기사입니다.

class Cruise(object): 
    def arewelostyet(self): 
     print 'Young sailor: I think I am lost, help me :s' 

instance = Cruise() 

instance.arewelostyet() 

def whereami(lostfunc): 
    """ 
    decorator 
    """ 
    def decorated(*args, **kwargs): 
     lostfunc(*args, **kwargs) 
     print 'Frog: Crôak! thou art sailing in class', lostfunc.im_class.__name__ 

    # don't forget to write name and doc 
    decorated.func_name = lostfunc.func_name 
    decorated.func_doc = lostfunc.func_name 

    return decorated 


print '[i]A frog pops out of nowhere[/i]' 

# decorate the method: 
Cruise.arewelostyet = whereami(Cruise.arewelostyet) 

instance.arewelostyet()