2009-03-26 8 views
0

誰かが特定の理由(純粋に文体以外のもの)を知っているのであれば、なぜこれらの構文がクラスを開始するのか?この構文がクラスのインスタンス化に使用される特別な理由はありますか?

のPython:

class MyClass: 
    def __init__(self): 

x = MyClass() 

ルビー:

class AnotherClass 
    def initialize() 
    end 
end 

x = AnotherClass.new() 

コンストラクタと、実際にクラスのインスタンスを取得するために使用する構文のために使用する構文は非常に異なっている理由を私は理解できません。確かに、それは実際には違いはありませんが、例えば、ルビでコンストラクタを "new()"にするのは何が問題なのでしょうか?

+0

何が質問ですか?なぜ__init__は "新しい"という綴りではないのですか?なぜ初期化は「新しい」という綴りではないのですか? –

答えて

4

実際には、Pythonではコンストラクタは__new__()で、__init__()はインスタンス初期化子です。

__new__()は静的なクラスメソッドなので、最初に呼び出す必要があります(最初はclsまたはklassという名前の)最初のパラメータとしてクラスを取得します。オブジェクトインスタンスを作成し、最初のパラメータ(通常はselfという名前)として__init__()に渡し、他のすべてのパラメータは__new__のパラメータとともに渡します。

+0

@SilentGhost:申し訳ありませんが、これらのインラインURLを使用して編集するのは難しいことでした。 – vartec

5

クラスのオブジェクトを作成するときは、それを初期化するだけではありません。あなたはそれのためのメモリを割り当てて、次にそれを初期化し、それを返します。

Rubyではnew()がクラスメソッドであり、initialize()はインスタンスメソッドであることにも注意してください。 new()を単にオーバーフローさせた場合は、オブジェクトが作成済みであるためselfを参照することができるより簡単なものではなく、より簡単なオブジェクトであるinitialize()ではなく、オブジェクトを最初に作成して操作して戻す必要があります。 -new()(またはRubyでは、暗黙のうちにselfをオフにします)。

Objective-Cでは、割り振りメソッドから引数リストを渡すことができないため、Objective-Cでは、割り当てと初期化を別々に行う必要があるため、実際に何が起こっているのかをもっとはっきりと見て取ることができます

[[MyClass alloc] initWithFoo: 1 bar: 2]; 
+0

私は、new()がシングルトンの場合のように便利であることに注意してください。 – Pesto

0

これは、Pythonではコンストラクタが単なる別の関数なので便利です。たとえば、私はこれを何度か繰り返しました:

def ClassThatShouldntBeDirectlyInstantiated(): 
    return _classThatShouldntBeDirectlyInstantiated() 

class _classThatShouldntBeDirectlyInstantiated(object): 
    ... 

もちろん、これは実例ですが、あなたはそのアイディアを得ています。基本的には、あなたのクラスを使用するほとんどの人は、あなたのクラスとしてClassThatShouldntBeDirectlyInstantiatedを考えているでしょうし、そうでないと考えるようにする必要はありません。このようにして、ファクトリ関数をインスタンス化するクラスとして文書化し、そのクラスを使用する人を混乱させないようにするだけです。

C#やJavaのような言語では、コンストラクタやファクトリ関数を使用するかどうかを判断するのが難しいため、このようなクラスを作成するのは面倒です。私もこれがRubyのケースであるかどうかはわかりません。

関連する問題