2009-03-26 11 views
0

누군가가 특별한 이유 (순전히 문체가 아닌 것)를 알고 있다면 다음과 같은 언어가이 구문을 사용하여 클래스를 시작하는 이유가 궁금합니다.이 구문을 사용하여 클래스를 인스턴스화하는 특별한 이유가 있습니까?

파이썬 :

class MyClass: 
    def __init__(self): 

x = MyClass() 

루비 :

class AnotherClass 
    def initialize() 
    end 
end 

x = AnotherClass.new() 

생성자 실제로 클래스의 인스턴스를 얻기 위해 사용되는 구문에 사용되는 구문이 이렇게 다른 이유는 이해할 수 없다. 물론, 그것이 실제로 차이를 만들지는 않지만, 예를 들어, 루비에서 생성자를 "new()"로 만드는 것이 잘못된 것입니다.

+0

무엇이 질문입니까? 왜 __init__은 "새로운"철자가 아닌가요? 초기화가 "새로운"철자가 아닌 이유는 무엇입니까? –

답변

4

실제로 파이썬에서 생성자는 __new__()이고 __init__()은 인스턴스 초기화 프로그램입니다.

__new__()은 정적 클래스 메서드이므로 첫 번째 매개 변수 (보통 cls 또는 klass)로 가져와 클래스를 가져와야합니다. 오브젝트 인스턴스를 생성 한 후 의 첫 번째 매개 변수 (일반적으로 self)와 나머지 모든 __new__의 매개 변수를 전달합니다.

+0

@SilentGhost : 죄송합니다.이 인라인 URL로 편집하는 것은 다소 어려웠습니다. – vartec

5

클래스의 개체를 만들 때 단순히 개체를 초기화하는 것 이상의 작업을 수행하고 있습니다. 당신은 그것을위한 메모리를 할당하고, 그것을 초기화 한 다음 반환한다.

Ruby에서 new()은 클래스 메소드이고 initialize()은 인스턴스 메소드입니다. new()을 지나치게 오버플로 한 경우 먼저을 참조 할 수있는 initialize()이라는 단순한 객체가 아닌 객체를 먼저 생성 한 다음 반환해야합니다. 객체는 이미 빌드 된 객체에 의해 생성되었으므로 -innew() (또는 루비에서는 묵시적으로 self을 사용하지 말 것).

Objective-C는 할당 방법의 인수 목록을 전달할 수 없으므로 Objective-C에서는 할당 및 초기화를 별도로 수행해야하므로 실제로 좀 더 명확하게 (그러나 좀 더 자세한 내용을) 알 수 있습니다.

+0

나는 new()가 싱글 톤의 경우에 유용 할 수 있다고 덧붙인다. – Pesto

0

이것은 파이썬에서 생성자가 다른 함수이기 때문에 유용합니다. 예를 들어, 여러 번 해본 적이 있습니다.

def ClassThatShouldntBeDirectlyInstantiated(): 
    return _classThatShouldntBeDirectlyInstantiated() 

class _classThatShouldntBeDirectlyInstantiated(object): 
    ... 

물론이 방법은 고의적 인 예이지만 아이디어를 얻을 수 있습니다. 기본적으로 클래스를 사용하는 대부분의 사람들은 클래스로 ClassThatShouldntBeDirectlyInstantiated를 생각할 것이므로 다른 생각을 할 필요가 없습니다. 이런 식으로 작업하는 것은 factory 함수를 인스턴스화하는 클래스로 문서화하고 클래스를 사용하는 사람을 혼란스럽게하지 않는 것입니다.

C# 또는 Java와 같은 언어에서 생성자 또는 일부 팩토리 함수를 사용해야하는지 여부를 결정하기가 어려울 수 있으므로 클래스를 만들 때 귀찮을 수 있습니다. 비록 이것이 Ruby에서도 마찬가지인지 확신 할 수 없다.

관련 문제