質問: className() instance.methodName() ``` とあるのですが、このコードの6行目をこう変更しました。 ``` class className(): def methodName(self): print("Hello World!") instance =className() print(instance) ``` 出力されるのが、クラスかインスタンスのアドレス のようになります。 出力結果 ``` <__main__.Class object at 0x03636390> ``` printの引数をインスタンス名にすると そのアドレスが出力される理由を教え下さい。
回答: 下記のような動作が行われ、そのインスタンスオブジェクトに`__str__()`や`__repr__()`が定義されていないので、objectのデフォルト実装の結果`<...some useful description...>`形式の文字列として`<__main__.Class object at 0x03636390>`が表示されると考えられます。 1. `str()`関数が呼ばれたように動作して文字列化する print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)の「キーワードなしの引数はすべて、 str() がするように文字列に変換され、」の部分 2. 内部的に、そのオブジェクトの`__str__()`メソッドが呼ばれる object.__str__(self)の「オブジェクトの「非公式の (informal)」あるいは表示に適した文字列表現を計算するために、 str(object) と組み込み関数 format(), print() によって呼ばれます。」の部分 3. `__str__()`が定義されていなければ、そのオブジェクトの`__repr__()`が呼ばれる object.__str__(self)の「組み込み型 object によって定義されたデフォルト実装は、 object.__repr__() を呼び出します。」の部分 4. `__repr__()`が定義されていなければ、おそらく組み込み型 object によって定義されたデフォルト実装が呼ばれる 内容はobject.__repr__(self)の「オブジェクトを表す「公式の (official)」文字列を計算します。可能なら、これは (適切な環境が与えられれば) 同じ値のオブジェクトを再生成するのに使える、有効な Python 式のようなものであるべきです。できないなら、`<...some useful description...>`形式の文字列が返されるべきです。」の部分 参考: Python 3の組み込み関数を速攻理解しよう: オブジェクト/スコープ/モジュール/動的評価/入出力編 (1/3) > > オブジェクトの文字列表現を取得する: ascii/repr > > > 組み込み関数reprを呼び出すと、最終的にはそのオブジェクトが持つ__repr__メソッドが呼び出される。このメソッドは「オブジェクトのオフィシャルな表現」を返送する。「オフィシャルな表現」とはPythonのドキュメント「object.__repr__」の説明によれば、「(適切な環境が与えられれば) 同じ値のオブジェクトを再生成するのに使える、有効な Python 式のようなものであるべき」であり、それが無理であれば「<...some useful description...> 形式の文字列」を返送すべきとなっている。そのため、上のサンプルでは文字列やリスト、タプルについては前者の表現が得られ、関数やクラス、インスタンスについては「<...some useful description...>」形式の文字列が得られている。 > > > Python、対話モードでの自動表示とprintの違い クラスオブジェクトとインスタンスオブジェクトってなに? Pythonのstr( )とrepr( )の使い分け [python]__repr__と__str__の違い