2013-04-30 3 views
2

매개 변수.파이썬 기술자 (__get__, __set__)는 일반적으로 기술자 그래서 같은 클래스 속성에 사용되는

Owner이 인스턴스화되면 instanceOwner의 인스턴스가됩니다.

이제이 개념을 클래스 속성 대신 메서드 매개 변수에 적용하고 싶습니다.

class Example(object): 
    def funct(self, param=Attr('t')): 
     return param == 'test' # < param calls the descriptor here 

e = Example() 
e.funct('es') # < is True because 'es' wrapped with 't' becomes 'test'. 

param에 액세스 Attr.__get__(self, instance, owner)self = funct.param, instance = functowner = funct 호출됩니다

이 실제로 어떻게 보일지

(의이 Attr의 기능이 주어진 문자열로 문자열을 래핑하는 것입니다 가정하자) (ownerinstance이 같은 것은 아니지만 None 일 수 있습니다.). 그러나 funct은 클래스가 아니기 때문에 작동하지 않습니다. 어떻게하면 일과 비슷한 것을 얻을 수 있습니까?

함수의 데코레이터가 매개 변수를 처리하므로 이것이 내가 생각하는 해결책에 추가 될 수 있습니다. 데코레이터는 예를 들어 래퍼 문자열을 변경할 수 있어야합니다.

+1

'param '에 액세스하는 방법을 보여주는 사용 시나리오를 추가 할 수 있습니까? – unutbu

+0

이 기능의 목적은 무엇입니까? 함수에 상태를 첨부하려고합니까? 인수를 통해 함수의 동작을 동적으로 정의하려고합니까? 함수가 실행될 때까지 일부 종속성의 해결을 지연하려고합니까? –

+0

@unutbu 나는 더 잘 어울리는 사용 예제를 추가했다. 지금은 더 명확 해 졌다고 생각하니? – siebz0r

답변

2

실제로 함수는 파이썬에서 제일 객체입니다. 그러나 당신이 설명하는 구문이 원하는대로 작동하지 않는다고 말하는 것이 옳습니다. 이러한 종류의 기능을 가능하게하는 특성에 대해 전달 된 특성을 검사하는 데코레이터를 사용하면 잠재적으로 이와 같은 작업을 수행 할 수 있습니다. 그러나 호출 가능한 객체를 구현 한 다음 설명자를 첨부하고 함수가 아닌 호출 가능 함수의 인스턴스를 만드는 것이 더 나을 것입니다.

+0

저는 문제를 해결하는 다른 방법을 선택했습니다. 그러나이 방법이 효과적입니다. 내 데코레이터는 데코 레이팅 된 객체의 '서명'을 유지합니다.이 기능은 설명자 속성을 사용하여 호출 가능한 클래스를 만들고 '__call__' 메소드에서 함수를 래핑함으로써 얻을 수 있습니다. 원래 함수의 argspec은'__call__' 메쏘드에 복사 될 수 있습니다. 좋은! side-note : 함수/메소드가 사용된다는 요구 사항 이었지만 일반 호출 가능 클래스는 충분하지 않았지만 데코레이터로 가능해야합니다. – siebz0r