66045


こんにちは。Python初心者です。オブジェクト指向を学びたいと思いこちらの  
サイトのコードを利用して、クラスのことを勉強しています。  
<https://www.sejuku.net/blog/64106>  
上記のサイトのコードを自分で変えてみてどのように動くかを試していました。

サイトには

[code]

    class className():
        def methodName(self):
            print("Hello World!")
    
    instance = className()
    instance.methodName()
    
[/code]

とあるのですが、このコードの６行目をこう変更しました。

[code]

    class className():
        def methodName(self):
            print("Hello World!")
    
    instance =className()
    print(instance)
    
[/code]

出力されるのが、クラスかインスタンスのアドレス  
のようになります。

出力結果

[code]

    <__main__.Class object at 0x03636390>
    
[/code]

printの引数をインスタンス名にすると  
そのアドレスが出力される理由を教え下さい。


CC BY-SA 4.0
2020-04-27T23:11:20.493
66042
2020-04-28T02:56:09.337
2020-04-28T02:56:09.337
19110
39846
question
python python3
printの引数をインスタンス名にするとそのアドレスが出力される理由を教えて下さい。


下記のような動作が行われ、そのインスタンスオブジェクトに`__str__()`や`__repr__()`が定義されていないので、objectのデフォルト実装の結果`<...some
useful description...>`形式の文字列として`<__main__.Class object at
0x03636390>`が表示されると考えられます。

  1. `str()`関数が呼ばれたように動作して文字列化する  
[print(*objects, sep=' ', end='\n', file=sys.stdout,
flush=False)](https://docs.python.org/ja/3/library/functions.html#print)の「キーワードなしの引数はすべて、
str() がするように文字列に変換され、」の部分

  2. 内部的に、そのオブジェクトの`__str__()`メソッドが呼ばれる  
[object.__str__(self)](https://docs.python.org/ja/3/reference/datamodel.html#object.__str__)の「オブジェクトの「非公式の
(informal)」あるいは表示に適した文字列表現を計算するために、 str(object) と組み込み関数 format(), print()
によって呼ばれます。」の部分

  3. `__str__()`が定義されていなければ、そのオブジェクトの`__repr__()`が呼ばれる  
[object.__str__(self)](https://docs.python.org/ja/3/reference/datamodel.html#object.__str__)の「組み込み型
object によって定義されたデフォルト実装は、 object.__repr__() を呼び出します。」の部分

  4. `__repr__()`が定義されていなければ、おそらく組み込み型 object によって定義されたデフォルト実装が呼ばれる  
内容は[object.__repr__(self)](https://docs.python.org/ja/3/reference/datamodel.html#object.__repr__)の「オブジェクトを表す「公式の
(official)」文字列を計算します。可能なら、これは (適切な環境が与えられれば) 同じ値のオブジェクトを再生成するのに使える、有効な Python
式のようなものであるべきです。できないなら、`<...some useful description...>`形式の文字列が返されるべきです。」の部分

参考：  
[Python 3の組み込み関数を速攻理解しよう： オブジェクト／スコープ／モジュール／動的評価／入出力編
(1/3)](https://www.atmarkit.co.jp/ait/articles/1704/28/news041.html)

> オブジェクトの文字列表現を取得する： ascii／repr
>
>
> 組み込み関数reprを呼び出すと、最終的にはそのオブジェクトが持つ__repr__メソッドが呼び出される。このメソッドは「オブジェクトのオフィシャルな表現」を返送する。「オフィシャルな表現」とはPythonのドキュメント「object.__repr__」の説明によれば、「(適切な環境が与えられれば)
> 同じ値のオブジェクトを再生成するのに使える、有効な Python 式のようなものであるべき」であり、それが無理であれば「<...some useful
> description...>
> 形式の文字列」を返送すべきとなっている。そのため、上のサンプルでは文字列やリスト、タプルについては前者の表現が得られ、関数やクラス、インスタンスについては「<...some
> useful description...>」形式の文字列が得られている。

[Python、対話モードでの自動表示とprintの違い](https://torina.top/detail/450/)

[クラスオブジェクトとインスタンスオブジェクトってなに？](https://python.ms/instance-and-class/)

[Pythonのstr( )とrepr( )の使い分け](https://gammasoft.jp/blog/use-diffence-str-and-
repr-python/)

[[python]__repr__と__str__の違い](https://chaingng.github.io/post/python_repr/)


CC BY-SA 4.0
2020-04-28T00:38:11.247
66044
2020-04-28T00:38:11.247
2020-06-17T08:14:45.997
-1
26370
66042
answer


> printの引数をインスタンス名にすると

printに渡している`instance`は`インスタンス名`ではなく、  
クラス`className`のインスタンスそのものです、インスタンスの名前ではありません。

クラスに`__str__()`が定義されていれば`__str__()`の復帰値が表示されますが、  
未定義の場合は`<main.Class object at 0x03636390>`が表示されるようです。

`__str__()`を定義した次のコードを実行すると`ABC`と表示されます。

[code]

    class className():
        def __str__(self):
            return "ABC"
        def methodName(self):
            print("Hello World!")
    
    instance =className()
    print(instance)
    
[/code]

私には、どうしてそうなのかを説明することができません、そういう仕様だと理解しています。


CC BY-SA 4.0
2020-04-28T01:05:11.630
66045
2020-04-28T01:05:11.630
35558
66042
answer