1) 왜 self
메소드 서명에서 명시적인 매개 변수로 필요합니까?
방법은 함수이고 foo.bar(baz)
단지 구문 설탕 이기 때문 입니다 bar(foo, baz)
. 클래스는 일부 값이 함수 인 사전 일뿐입니다. (생성자도 함수일 뿐이 new
므로 파이썬이 필요하지 않습니다. ) 파이썬은 객체가 더 간단한 컴포넌트로 만들어 졌다는 것을 명시 적으로 말할 수 있습니다. 이것은 "명시적인 것이 묵시적인 것보다 낫다"라는 철학에 따른 것입니다.
반대로 Java 객체에서는 실제로 마술이며 언어의 간단한 구성 요소로 축소 될 수 없습니다. Java에서 (적어도 Java 8까지) 함수는 항상 객체가 소유 한 메소드이며,이 소유권은 언어의 정적 특성으로 인해 변경할 수 없습니다. 따라서 무엇을 this
의미 하는지 모호하지 않기 때문에 암시 적으로 정의하는 것이 좋습니다.
JavaScript는 this
Java와 같이 암시 적이 지만 Python과 같은 객체와 별도로 함수가 존재할 수 있는 언어의 예입니다 . 이것은 함수가 다른 컨텍스트에서 전달되고 호출 될 때 참조되는 것에 대해 많은 혼란을 초래 this
합니다. 많은 본능적으로 this
함수의 본질적인 속성을 참조해야하지만 실제로는 함수가 호출되는 방식에 의해 순수하게 결정됩니다. this
파이썬에서와 같이 명시 적 매개 변수로 사용하면 혼란을 덜 줄 수 있다고 생각 합니다.
명시 적 self
매개 변수 의 다른 장점 :
데코레이터는 다른 기능을 감싸는 기능입니다. 메소드는 단지 함수이기 때문에 데코레이터는 메소드에서 잘 작동합니다. 어떤 종류의 암시 적 자아가 있다면, 데코레이터는 메소드에서 투명하게 작동하지 않습니다.
클래스 메소드와 정적 메소드는 인스턴스 매개 변수를 사용하지 않습니다. 클래스 메소드 는 클래스 를 첫 번째 인수 (일반적으로 cls
)로 사용합니다. 명시 적 self
또는 cls
매개 변수를 사용하면 진행중인 작업과 메서드에서 액세스 할 수있는 대상이 훨씬 명확 해집니다.
2) 왜 인스턴스 변수는 항상 "로 한정되어야 self.
합니까? "
Java에서는 멤버 변수에 " this.
" 를 접두사로 붙일 필요는 없지만 Python에서는 " self.
"가 항상 필요합니다. 그 이유는 파이썬에 변수 선언을위한 명시적인 구문이 없기 때문에 x = 7
새로운 로컬 변수를 선언해야하는지 또는 멤버 변수에 할당해야하는지 알 수있는 방법이 없기 때문입니다 . 지정 self.
하면이 모호성이 해결됩니다.