2010-01-13 4 views
3

저는 지난 주에 루비 객체 모델을 이해하게되었지만 지금까지는 루비와 파이썬의 객체의 열매를 사용한 사용자 였지만 과거에는 이런 것들이 다른 언어로 어떻게 다른지 궁금해졌습니다.스몰 토크, 루비, 파이썬과 같은 동적 언어의 객체 모델의 주요 차이점은 무엇입니까

몇 년 전에 나는 작은 토크의 끽끽 거리기를 만졌습니다. 스몰 토크는 종종 참조 객체 지향 언어로 생각하고 있습니다. 그래서 그 언어에 관심이 있습니다. 루비 객체 모델은 객체와 클래스를 구별하지 않으며, 존재하는 싱글 톤 객체는 필요한 경우 모든 객체의 프로토 타입을 확장 가능하게 만듭니다. 나는이 모든 것들을 메타 객체 프로토콜로 정의 된 곳에서 알고있다. 이러한 것들은 C++ 또는 Java와 같은 다른 덜 동적 인 언어 나 다른 언어보다 더 쉽게 사용할 수 있습니다.

meta-object 프로토콜의 실현에있어 동적 언어, 특히 smalltalk, python 및 ruby가 다른 점은 무엇입니까?

+0

VPRI의 객체 모델, 자체 정의 환경 및 기타 기능에 대한 작업 중 일부는 마음이 날 것입니다. –

+2

http://docs.python.org/reference/과 같은 곳에서 요약이 유용하지 않거나 불완전하거나 부정확하다고 말하는 것입니까? 언어 매뉴얼의 문제점은 무엇입니까? 왜 이렇게 광범위하고 거대한 질문을 던지십니까? –

+1

Ruby 내부에 대한 이야기 ​​비디오 (객체 모델에 대한 몇 가지 참고 사항) : http://mtnwestrubyconf2008.confreaks.com/11farley.html – miku

답변

2

파이썬에서는 각 객체가 이고 하나는이다. 객체의 "속성"은 메쏘드, 간단한 참조가 될 수있다. descriptors (일반 속성이 인스턴스 또는 클래스에있을 수 있지만 메소드를 합성하는 설명자와 같은 함수 포함)은 다른 객체 (호출 가능 여부)에 저장되거나 플라이에서 합성됩니다 클래스가 아니라 인스턴스입니다. 따라서 특히 "특수 메소드"는 인스턴스가 아닌 클래스에 정의 된 경우에만 특별합니다. 특성 처리 내장 함수와 특수 메서드 (getattr, setattr,, __setattr__, ...)는 "일반 특성"을 참조하든 아니든 개체의 단일 네임 스페이스에서 동일한 방식으로 작동합니다. (파이썬 컴파일러가 알고 (도주의)하지 않습니다, 당신은 참조 a.b 등을 수행 할 수 있습니다

핵심은 모든 개체 a를 들어, 파이썬, a.b는 방법 (또는 호출 기타) 여부를 수 있다는 것이다 예를 들어, 인수로 전달하거나, 결과로 반환하거나, 목록에 추가하는 등의 작업은 a.b을 호출하지 않습니다. a.b을 호출하려는 경우 (시도 및 호출) 인수없이 호출하려면 a.b()을 사후 수정 괄호로 명시 적으로 지정합니다.

Ruby에서 객체의 메소드와 속성은 별도의 네임 스페이스에 있습니다 (따라서 메소드와 속성이 같은 객체를 가질 수 있습니다. 이름은 같지만 파이썬에서는이를 사용할 수 없습니다). - c=a.b은 속성 참조를 취할 수도 있고, b이 메소드와 속성을 모두 a에 지정하면, 사용법을 명확하게하기 위해 어떤 경험적 규칙이 사용되는지는 기억하지 않습니다.). 따라서 메소드 참조 (예 : 일부 컨테이너에서 숨기거나 인수 또는 리턴 값으로 사용)를 호출하고 나중에 호출을 수행하려면 다른 구문을 사용하십시오.

Smalltalk도 Ruby와 같이 별도의 네임 스페이스를 가지고 있지만 특정 객체의 "비 메소드"속성을 참조 할 수는 없습니다 (각 객체는 자체 속성 만 "인식"합니다). 따라서이 모호성은 발생하지 않습니다 특정 메시지를 추출하여 나중에 "메소드 참조"라고 부름).

+5

Ruby에서 'ab' * 항상 *는 메시지 보내기를 의미합니다 (즉, 항상 * ab *)와 같고 * 절대 * 절대 속성 참조가 없기 때문에 루비의 "속성"과 같은 것. 인스턴스 변수 만 있지만 인스턴스에 대해 비공개이며 이미 외부에서 액세스 할 수 없습니다 (이름에서 알 수 있듯이). (일단 리플렉션을 무시하면 모든 배팅이 해제됩니다.) –

+0

Jorg에서 지적한 바와 같이 Ruby에 대한 해설의 50 %가 잘못되었을 때 어떻게 이것이 '수락 응답'이 될지 모르겠습니다. . – horseyguy

2

내가 기억하는 파이썬과 스몰 토크의 주요 차이점은 속성 개인 정보가 처리되는 방식입니다. Smalltalk에서는 속성을 정의하고 즉시 모든 접근자를 생성해야했습니다 (다행스럽게도 Dolphin Smalltalk에서이 작업을 수행했습니다). 반면에 파이썬에서는 모든 것을 액세스 할 수 있습니다. 속성도 개인용으로 간주됩니다 (시작 부분에 __이 있고 ___을 형성하기 위해 맹 글링 된 속성). 잠재적으로 위험하다는 말을하는 사람도있을 것입니다. 예를 들어 특정 속성을 변경하면 나중에 어떤 작업을 수행해야 할 시점이 있습니다. 그러나 파이썬은 properties으로 우아하게 해결합니다.

나는 내가 원하는 것을 액세스 할 수 있다는 개념을 좋아합니다. 내가 아는 경우, 내가하고있는 일은 내가 할 수있다 :-)

+0

객체의 모든 속성이 공개되어있어 파이썬이 어떻게 보이는지 보여줍니다. 위험한. 이것은 모든 올바른 이유로 잘못된 것을 결정하기 위해 사용자 코드에서 객체의 내부를 숨기는 것을 불가능하게 만듭니다. –

+0

파이썬 프로그래머는 사용자가 아무것도 숨길 이유가 없습니다. 그들은 때로는 주석을 쓰는 경우도 있습니다 : # 이것을 만지지 마십시오 ;-) 모르는 사람, 뭘하고있는 것, 그리고 아직 만지면 상처를 입을 것입니다. 그러나 그것은 나이프와 비슷합니다. 위험합니다. 그러나 여러분은 그것들없이 빵을 자르지 않을 것입니다 :-) – gruszczy

+0

스몰 토크에서 거의 아무 것도 숨기를 생각하지 않습니다. Smalltalk 프로그래머는 인스턴스 변수 (속성)와 주석 (개발자가 어쨌든 잊어 버릴 수도 있음)을 읽을 필요없이 객체를 사용하기 위해 프로토콜 (브라우저의 메시지 목록) 만 살펴 봐야한다는 점을 잘 알고 있습니다. . 더 적은 작업, 더 많은 시간 :) – user869097

관련 문제