90985


Pythonの学習をはじめて数ヶ月目の初学者です。

参照したサイトに掲載されているコードにおける、インスタンス変数の以下の部分は必要なのでしょうか？二重で初期値を設定しているような気がするのですが…

>
[code]

>     name = None
>     age = None
>  
[/code]

コンストラクタの部分で、以下のように記述するのではいけないのでしょうか？  
何が違うのでしょうか？

[code]

    def __init__(self, name=None, age=None):
    
[/code]

**参照したサイト:**  
[Pythonでのclassの使い方とは？classの基本的な使い方やimportする方法を紹介](https://fenet.jp/dotnet/column/language/7266)

>
[code]

>     # クラス定義
>     class Human:
>         # インスタンス変数
>         name = None # 名前
>         age = None  # 年齢
>  
>         # クラスメソッド
>         def printinfo(self):
>             print('name：{0}, age：{1}' . format(self.name, self.age))
>  
>     # インスタンス生成
>     human1 = Human()
>     human1.name = 'taro'
>     human1.age = 20
>  
>     # インスタンス生成
>     human2 = Human()
>     human2.name = 'jiro'
>     human2.age = 40
>  
>     human1.printinfo()
>     human2.printinfo()
>  
[/code]


CC BY-SA 4.0
2022-09-07T08:35:12.573
90980
2022-09-10T16:34:27.777
2022-09-10T16:30:37.227
3060
27812
question
python
クラスにおけるインスタンス変数と、コンストラクタの引数の違い


参照されている教材（？）が間違っています。  
参照コードで「インスタンス変数」と書かれているのは実際には、クラス変数（クラス属性）です。  
参考: <https://docs.python.org/ja/3/tutorial/classes.html#class-and-instance-
variables>

この場合はクラス変数は利用されていませんので「クラス変数」を「インスタンス変数」と書き間違えたものでもなく、勘違いによって書かれた削除されるべきコードだと思われます。


CC BY-SA 4.0
2022-09-07T09:06:51.373
90983
2022-09-07T09:06:51.373
3054
90980
answer


提示されたソースコード内に、コメントで`# インスタンス変数`と書かれているのは`# クラス変数`の間違いです。  
何処の教材や資料を基にしたのか知りませんが、その資料または貴方が何処かから持ってきた時に書き間違えたかしたのでしょう。

Pythonの解説資料では`# class variable shared by all instances`と書いてあります。

[9.3.5.
クラスとインスタンス変数](https://docs.python.org/ja/3/tutorial/classes.html#class-and-
instance-variables)

>
> 一般的に、インスタンス変数はそれぞれのインスタンスについて固有のデータのためのもので、クラス変数はそのクラスのすべてのインスタンスによって共有される属性やメソッドのためのものです:
[code]

>     class Dog:
>  
>         kind = 'canine'         # class variable shared by all instances
>  
>         def __init__(self, name):
>             self.name = name    # instance variable unique to each instance
>  
[/code]

>
> ...以下省略

ということでスクリーンショットのソースコードだけの内容で考えると、最初の`インスタンス変数`であるという所で間違えているので、後半の疑問に関してはいったん忘れて正しい情報の元にプログラムの内容を考えてみましょう。

こんな記事が参考になるかもしれません。  
[Python クラス変数 と インスタンス変数 の違い](https://aiacademy.jp/media/?p=922)  
[Pythonのクラス変数とインスタンス変数](https://uxmilk.jp/41600)  
[クラス変数とインスタンス変数ってなに？](https://python.ms/attribute/)  
[Pythonではインスタンス変数をクラス定義直下に書いてはいけない(戒め)](https://qiita.com/kxphotographer/items/60588b7c747094eba9f1)  
[Pythonでクラス変数とインスタンス変数を取り違えてハマった](https://qiita.com/7shi/items/d37493c58a8bb8d7beed)


CC BY-SA 4.0
2022-09-07T09:09:46.430
90985
2022-09-10T16:34:27.777
2022-09-10T16:34:27.777
3060
26370
90980
answer