質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1539閲覧

Python3: initで定義すること

Nippun

総合スコア1147

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1グッド

1クリップ

投稿2017/12/27 06:44

Python3でclassを使う際にinitを使うことがありますが、それについて質問があります。

python

1class Person(object): 2 3 def __init__(self): 4 self.gpa = 2 5 self.num = 4 6

python

1 2class Person(object): 3 4 gpa = 2 5 num = 4 6コード

この2つのクラスは全く同じことをしていることになりますか?
また、このようにすでにクラス内の変数の初期値が決まっているときはinitを使わなくてもいいのですか?
(_init_(self, gpa=3)とする必要もないとき)

退会済みユーザー👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

前者はインスタンス変数として、後者はクラス変数として値を管理します。
UX MILK - Pythonのクラス変数とインスタンス変数

簡単に言うと、クラス変数にはクラス名.変数名でアクセスできます。

Python

1class Hoge: 2 a = None 3 4 def __init__(self): 5 self.b = None 6 7hoge = Hoge() 8Hoge.a # ok 9Hoge.b # ng 10hoge.b # ok

基本的にはインスタンス変数を使い、次のようなときにクラス変数を使うと良いでしょう。

  • 定数的に変数を用いる場合

ただし、値を不用意に書き換えてしまわないように注意する必要があります。

  • どうしても各インスタンス共有の変数が欲しい場合

例えばJavaのstaticフィールドのような用法です。
便利な場面もありますが、挙動を追いづらくなるデメリットがあります。


また、このようにすでにクラス内の変数の初期値が決まっているときはinitを使わなくてもいいのですか?

(_init_(self, gpa=3)とする必要もないとき)

そのような場合、__init__自分で定義しなくてもかまいません。
ただし、__init__が存在しないわけではありません。

Python

1>>> class Hoge: 2... """中身が空っぽなクラスだよ""" 3... pass 4... 5>>> dir(Hoge) 6['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__'] 7>>> Hoge.__init__ is object.__init__ 8True

投稿2017/12/27 06:52

編集2017/12/27 07:03
LouiS0616

総合スコア35658

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Nippun

2017/12/27 07:13

ご回答ありがとうございます。 とてもわかりやすいですが、質問があります。 クラス内でクラス変数にアクセスする際にselfかクラス名どちらをつけるべきですか? また、gpaはクラス変数としてクラス外で aaa = Person() aaa.gpa Person.gpa これはどちらもおなじクラス変数を参照しているということでいいんですか?
LouiS0616

2017/12/27 07:21 編集

参照するときは、どちらも同じクラス変数を見ています。 ただし、代入する際には注意が必要です。 例えば aaa.gpa = 'hoge' などとしたとき、gpaというインスタンス変数が作られてしまいます。 つまり、aaa.gpa と Person.gpa が異なる変数となってしまうのです。 ですので、『クラス変数にはクラス名.変数名でアクセスする』とルールづけてしまった方が良いかと思います。
Nippun

2017/12/27 08:09

ありがとうございます。 理解が深まりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問