2012-11-22 2 views
0

질문이 혼란 스럽습니다. 여기에 예제가 있습니다.파이썬 자체 : 자신을 참조하는 함수에 자신을 전달해야합니까?

class some_class(): 
    some_var = 5 
    def some_fun(self): 
    def another_fun(): 
     return self.some_var 

괜찮습니까? 나는 가지고있을 필요가 없다 : 자기 자신을 부르는 another_fun (self)? 나는 실제로 그것을 테스트하고 작동합니다. 나에게 약간의 확신이 들기 때문에 나는 단지 약간의 설명을 원했다.

답변

5

은이 another_fun는 다른 기능으로 중첩되어 있기 때문에 필요한, 그래서 그 함수에서 그것을 캡처 로컬 이름 및 그 self을 포함하지 않습니다. 실제로 some_fun에서 액세스 할 수있는 이름도 another_fun에 액세스 할 수 있습니다.

일부는 마감 코드이며, 기능을 만드는 함수를 작성하는 것이 좋습니다. 고전적인 예는 다음과 같습니다.

def MultiplyBy(x): 
    def M(y): 
     return x * y 
    return M 

Double = MultiplyBy(2) 
Triple = MultiplyBy(3) 

print Double(10), Triple(10) 

그러면 20 30이 인쇄됩니다.

+0

덕분에, 지금은 폐쇄가 뭔지 배웠습니다. – dtc

2

예. 한 함수를 다른 함수 안에 정의하면 내부 함수가 외부 함수에서 변수를 읽을 수 있습니다. 이것은 self에만 해당되는 것은 아닙니다. 그것은 모든 기능의 모든 변수에 대해 작동 :

>>> def outer(): 
...  a = 2 
...  def inner(): 
...   print a 
...  inner() 
>>> outer() 
2 

파이썬 (2)에서 (즉, 사용자가 a = 3 상기 inner 내부를 할 수 없다) 내부 함수 외부 변수를 다시 바인딩 없다. Python 3에서는 nonlocal 문을 사용하여이를 수행 할 수 있습니다.

그러나 왜이 작업을 수행하고 있습니까? 처음에는 위의 코드가 another_fun으로 전화하지 않았으므로 그 내용은 중요하지 않습니다. 일반적으로 다른 함수 안에서 함수를 정의하는 것은 약간 이상한 일입니다. 확실히 합법적 인 경우 (예 : 데코레이터)가 있지만, 많은 경우 혼동을 일으킬 수 있습니다. 귀하의 경우에는

+1

사실, 데코레이터는 합법적이며 혼동을 일으킬 수 있습니다. – rodrigo

+0

@rodrigo : 나는 두 가지 상황이 상호 배타적이라고 말하지 않았다 :-) – BrenBarn

+0

특별한 이유가 없으며, 우연히 일부 코드를 변경할 때 우연히 그 일이 발생했다. 덕분에 응답 – dtc

관련 문제