80760


pythonのあるプログラムを作っています。  
その際に、classを定義した後に、`__init__`の定義をしているのですが、  
`self.ccc = self._ddd()`と定義している箇所は、`__init__`に追加した`ccc`というアトリビュートを
`_ddd`というアトリビュート名に変更しているという認識で良いか教えてください。  
`self.aaa = aaa`は`__init__`に`aaa`というアトリビュートに追加したものを`aaa`と呼ぶことにする。  
という風に定義していると認識しています。

[code]

    class abc(object):
    
        def __init__(self, aaa, encoding='utf-8'):
            self.aaa = aaa
            self.bbb = bbb
            self.ccc = self._ddd()
    
[/code]


CC BY-SA 4.0
2021-08-12T08:04:49.707
80747
2021-08-13T00:16:26.717
2021-08-12T10:39:34.650
43025
31472
question
python
pythonの__init__でのアトリビュートの追加内容に


書かれていない情報を補完して考えると、いずれも「その認識は合っていない」でしょう。

「`__init__`に追加した`ccc`というアトリビュート」,「`_ddd`というアトリビュート名に変更している」,「`__init__`に`aaa`というアトリビュートに追加したものを`aaa`と呼ぶことにする」といった考え方/とらえ方は、おそらく
[Pythonのオブジェクトとクラスのビジュアルガイド – 全てがオブジェクトであるということ](https://postd.cc/pythons-
objects-and-classes-a-visual-guide/) とか
[Ptyhonとポインタの覚書](https://qiita.com/Daisy/items/a39e60f530f9adde422c),
[組み込みエンジニアの戸惑い Pythonの変数ってポインタ？](https://www.fsi-
embedded.jp/kumico/column/440/)
あたりから来ているのかもしれませんが、真意はともかく文章として書くべき内容は以下が正しいでしょう。

  * Xxxx「に」追加した、と記述するなら、その対象は`__init__`ではなく`abcクラスのインスタンス`でしょう。  
`__init__`を主体に書くなら`__init__`「で」追加した(orする)となるでしょう。

  * 「追加した」という記述も分からなくは無いですが、それよりは`__init__`はコンストラクタなのだから「宣言して初期化した」と記述する方が相応しいでしょう。
  * 「というアトリビュート名に変更している」,「と呼ぶことにする」という記述だと何か「リダイレクトするように設定している」風に見えますが、行われていることはそうではなくて「宣言した変数に **代入** している」になるでしょう。
  * `self.ccc = self._ddd()`という記述は、「`_ddd`というアトリビュート名に変更している」ではなくて、`()`が付いているので`self._ddd()`を呼び出した結果の戻り値を`self.ccc`に代入しています。  
@oriri
さんのコメントの書き方`print(o.ccc)`をすれば、`self._ddd()`が呼び出されるのではなく、単に代入された戻り値が表示されます。

    * `()`を付けない`self.ccc = self._ddd`という記述にすると、`self.ccc`には`self._ddd`メソッドのオブジェクトが代入されます。  
メソッドのオブジェクトが代入されている場合、@oriri
さんのコメントの書き方`print(o.ccc)`をすれば、オブジェクトの情報が表示されます。(間接的に)`self._ddd()`を呼び出すためには、`print(o.ccc())`と言う風に`o.ccc`に`()`を付ける必要があります。

  * `self.aaa = aaa`も、「と呼ぶことにする」ではなくて、`abcクラスのインスタンス`を作成する際に指定した **最初のパラメータ(aaa)** を`self.aaa`に **代入した** という処理になります。

参考記事  
[9.3.2. クラスオブジェクト - 9.
クラス](https://docs.python.org/ja/3/tutorial/classes.html#class-objects)  
[9.3.3. インスタンスオブジェクト - 9.
クラス](https://docs.python.org/ja/3/tutorial/classes.html#instance-objects)

[【Python】クラスの基本的な使い方（コンストラクタ・メソッド・インスタンス）](https://office54.net/python/class-
constructor-instance)  
[Python クラスについて](https://qiita.com/motoki1990/items/376fc1d1f3d59c960f5c)  
[pythonのclassについて](https://qiita.com/hiroyuki_mrp/items/140d47df01553091d59a)  
[属性の参照について分かりやすく解説](https://codor.co.jp/python/reference-to-attribute)  
[12\. Pythonのアトリビュート](https://sites.google.com/site/kuraitlab/programing-
language/python/attributes)


CC BY-SA 4.0
2021-08-12T23:47:49.103
80760
2021-08-13T00:16:26.717
2021-08-13T00:16:26.717
26370
26370
80747
answer