Python3の復習(オブジェクトとクラス①-クラスの定義-)
こんにちは。
絶賛統計学(ベイズ統計学)勉強中のかにたまごです。
まだ初歩の初歩ですが、数弱の僕にとってはかなり苦戦する内容です(;^ω^)
どうにかプログラミングに落とし込んで記事にしたいですね・・・。
活用出来たら楽しいんだろうな~。
それはさておき、今回は
- オブジェクトとクラス(クラスの定義)
について、復習していきたいと思います。
この内容についてはピンポイントで見返したいので、細かく分けて記事にしていきます。
今までのPython3 復習履歴は以下の通り。
- 数値・文字列
- リスト・タプル
- 辞書・集合
- if文・while文・for文
- 内包表記
- 関数
- ジェネレータ
- デコレータ
- 名前空間とスコープ
- アンダーバー・アンダースコアの意味
- エラー処理:try・except
- モジュール・パッケージ
- 標準ライブラリ
オブジェクトとクラス①-クラスの定義-
- オブジェクトとは
ポイントっぽいところを羅列しておく。
・Pythonのあらゆるものはオブジェクト
・そのオブジェクトにはデータ(変数、属性)とコード(関数、メソッド)が含まれる
・文字列オブジェクトを作成すれば、replace関数やupper関数が内蔵されている
・独自のオブジェクトを定義する場合は、クラスを作成しなければならない
- クラスの定義
クラスは、固有の特徴を備えたオブジェクトを作るための鋳型のようなもの。
クラスを介して作成される、固有の特徴を持つオブジェクトをインスタンスと呼ぶ(って認識)。
一番簡単なクラスの定義。
定義しただけでは使用できないので、"person = Nogizaka46()" の部分でオブジェクトを作成する。
class Nogizaka46(): pass person = Nogizaka46() print(person)
<__main__.Nogizaka46 object at 0x038095B0>
__init__を持たせることでオブジェクトが持つ変数などを初期化することができる。
インスタンスが作成された時点で第一引数selfに作成されたインスタンス自体の参照が入る。
class Nogizaka46(): def __init__(self): pass person = Nogizaka46() print(person)
<__main__.Nogizaka46 object at 0x02C895B0>
ここで第一引数にselfを引数に取らないと、エラーが発生する。
class Nogizaka46(): def __init__(): pass person = Nogizaka46()
Traceback (most recent call last): File "C:\Users\***\Desktop\Python\Test\blog_test.py", line 863, in <module> person = Nogizaka46() TypeError: __init__() takes 0 positional arguments but 1 was given
試しにselfの中身を見てみる。
class Nogizaka46(): def __init__(self): print("作成されたオブジェクト: ", self) print("ID: ", id(self)) pass person1 = Nogizaka46() person2 = Nogizaka46()
すると、インスタンス化されたときにselfにオブジェクトの参照が入っていることが分かる。
作成されたオブジェクト: <__main__.Nogizaka46 object at 0x034C98F0> ID: 55351536 作成されたオブジェクト: <__main__.Nogizaka46 object at 0x034C9A70> ID: 55351920
第一引数に取る "self" は別の名前でも構わない。
class Nogizaka46(): def __init__(member): print("作成されたオブジェクト: ", member) print("ID: ", id(member)) pass person1 = Nogizaka46() person2 = Nogizaka46()
作成されたオブジェクト: <__main__.Nogizaka46 object at 0x03279A90> ID: 52927120 作成されたオブジェクト: <__main__.Nogizaka46 object at 0x03279AB0> ID: 52927152
ただ、慣習として "self" が使われているので、変えない方が無難。
今の状態では何の情報も動作も持たないオブジェクトなので、とりあえず情報を追加してみる。
class Nogizaka46(): def __init__(self, name, joined): self.name = name self.joined = joined person1 = Nogizaka46("中田加奈", "1期生") person2 = Nogizaka46("高山一実", "1期生")
名前と何期生かという情報を初期値として追加した。
このようなオブジェクト固有の情報を属性と呼ぶ。
name属性を確認すると、それぞれ固有の値を持っていることが分かる。
class Nogizaka46(): def __init__(self, name, joined): self.name = name self.joined = joined person1 = Nogizaka46("中田加奈", "1期生") print("person1のname属性: ", person1.name) person2 = Nogizaka46("高山一実", "1期生") print("person2のname属性: ", person2.name)
person1のname属性: 中田加奈 person2のname属性: 高山一実
インスタンス化時に 名前と何期生か を入れ忘れるとエラーが発生する。
class Nogizaka46(): def __init__(self, name, joined): self.name = name self.joined = joined person1 = Nogizaka46("中田加奈", "1期生") #print("person1のname属性: ", person1.name) person2 = Nogizaka46("高山一実") #print("person2のname属性: ", person2.name)
Traceback (most recent call last): File "C:\Users\***\Desktop\Python\Test\blog_test.py", line 874, in <module> person2 = Nogizaka46("高山一実") TypeError: __init__() missing 1 required positional argument: 'joined'
参考書には書いてなかったけど、コンストラクタ的な感じ?
__init__は持たなくても機能はするけど、必ず初期化したい値がある場合は持たせるべきってことかな。
class NotExistsInit(): name = None joined = None test1 = NotExistsInit() test1.name = "中田加奈" print(test1.name) test2 = NotExistsInit() test2.name = "高山一実" print(test2.name)
この場合、どちらかを入れ忘れても問題ない。
中田加奈 高山一実
頭で理解してても、いざ使おうとしたときにできないことって多い。
どこでどう使うかをもっと勉強しなきゃダメだな。
以上です。