2010-11-22 5 views
4

'self'에 대해 the SO post을 읽었으며 클래스에 Python documentation을 읽었습니다. 파이썬 수업과 그 안에있는 컨벤션에서 self의 사용법을 이해한다고 생각합니다.Python 'self'for function

그러나 비교적 Python과 그 관용구에 익숙하지 않기 때문에 일부는 절차 유형 정의에서 self을 사용하는 이유를 이해할 수 없습니다. 예를 들어, Python documentation on integer types에서 예시적인 함수는 다음과 numself이 동일한 기능적 결과 교체

def bit_length(self): 
    s = bin(self)  # binary representation: bin(-37) --> '-0b100101' 
    s = s.lstrip('-0b') # remove leading zeros and minus sign 
    return len(s)  # len('100101') --> 6 

; 예 : self가 첫 번째 경우에 사용되는 이유가 여기에 볼 수 있습니다 __init__ 같은 더 관용구 등 없습니다

def bit_length(num): 
    s = bin(num)  # binary representation: bin(-37) --> '-0b100101' 
    s = s.lstrip('-0b') # remove leading zeros and minus sign 
    return len(s)  # len('100101') --> 6 

. 절차 적 함수의 다른 곳에서도이 사용을 보았고 혼란 스럽습니다.

내 질문 : 클래스 또는 메서드가없는 경우 설명적인 매개 변수 이름 대신 함수 정의에 self을 사용해야하는 이유는 무엇입니까?

답변

6

예에서 bit_length는 int 클래스의 함수로 정의되어 있으므로 실제로는 '클래스 또는 메서드'가 있습니다. 그 아이디어는 여러분이 bit_length를주기 위해 정수를 요구한다는 것입니다. 따라서 그것은 자기를 인수로 취하도록 정의됩니다.

+2

즉, 문서는 'int'메소드 중 하나를 구현하는 것과 동등하지만 비효율적 인 구현을 보여주기 때문에 'self'가 사용됩니다. –

4

실제 이유는 없습니다. 그러나 기존 클래스에 monkeypatch하려고한다면 코드를 읽을 수있는 사람에게 약간의 알림 기능을합니다.

+0

. 메소드는 단지 함수 (대부분은)'def do_stuff (self) : ...'이고,'Clazz.do_stuff = do_stuff'는 평소와 같이'do_stuff' 메소드를 정의하는 것과 거의 같고, 명백한/해키하고 그러므로 당신이 원숭이 - 패칭 일 때를 제외하고는 유용하지 않습니다. – delnan

+1

-1. 올바르지 않습니다. 문서는'int' 메소드 중 하나의 구현을 보여줍니다. 그래서'self'를 사용합니다. –