Python15分講座 #3 (クラス)
講師はid:Yoshioriさんです。
クラスの定義
Javaとコードを比較して書くのが(Javaプログラマには)わかりやすいと思うので
自分自身の確認のためにもJavaと比較しながら書いていこうと思います。
※まだPythonでのアクセス修飾子について勉強していないので
Javaのコード中のアクセス修飾子はスルーしてください。
# 一番簡単なクラス定義 class Hoge: pass
中身のない単純なクラスです。
Pythonではインデントがない=ブロックがないことになるので
何も書かないとSyntax Errorになります。
passはそれを防ぐために書く特に意味のない語です。
次に、少し複雑なクラスをJavaと比較しながら定義してみます。
// Javaのコード public class Hoge{ // インスタンス変数 private String foo; // コンストラクタ public Hoge(String bar){ this.foo = bar; } // インスタンスメソッド public void printFoo(){ System.out.print(this.foo); } }
# Pythonのコード class Hoge(object): # コンストラクタ() def __init__(self, bar): self.foo = bar # インスタンスメソッド def printFoo(self): print(self.foo)
全く同じ機能を持ったコードを並べて書きました。
上から違う点を見ていきます。
①クラスの継承
class Hoge(object):
はobjectクラスを継承したHogeクラスを宣言したことになります。
(objectクラスの先頭の文字は小文字でよいそうです。)
②コンストラクタ(初期化メソッド)
def __init__(self, bar):
__init__がJavaで言うコンストラクタの名前です。
クラスが違っても共通の名前です。
initがアンダーバー2つに囲まれてることに注意です。
③コンストラクタの引数
Pythonのコードのコンストラクタでは第一引数に「self」が指定してあります。
これはJavaで言う「this」です。(selfはしかるべきエディタではハイライトされます)
Pythonでは、Javaで言う「this」を明示的に「self」と指定してあげます。
「self.foo = bar」はインスタンス変数fooを宣言と同時に初期化したことになります。
「def printFoo(self):」も同様にインスタンスメソッド。
printFoo()を呼び出すときは
# インスタンスの生成 hogeInstance = Hoge('hogehoge') # インスタンスメソッドを呼び出す # selfを指定しないことに注意 # インスタンスメソッドを呼び出す時は、引数selfは自動的に代入される hogeInstance.printText()
[実行結果]
hogehoge
[7/16訂正]
訂正前のコードではコンストラクタの引数にselfを渡していましたが誤りなので訂正しました。
id:sugyanさん、ご指摘ありがとうございます。
ちなみにこのコードでコンストラクタの引数にselfを渡すとName Errorになりました。
実は、selfの代わりに別の名前でもかまいません。
ですが、あとあとクラス変数も使うようになったときに
それがインスタンスのものなのか、クラスのものなのかわかりにくくなります。
なので、selfを使うようにします。
この仕組みはすごくいいなと思いました。
Javaのthisは勝手に作られてどこから来たのか普通わからないですが
Pythonではそれもちゃんと自分で受け渡しするものなんですね。
クラス変数などのことも教えてもらったのですが、いろいろ確かめたいことがあって
まだ自分でいろいろ実験できてないので続きはまたにします><
新人は早く帰る決まりがあるのです。