Pythonの学習の過程とか

学習の記録をつけておきましょう。Python3に少しずつ移行していきます。過去の記事のソースを2から3に、、、と考えましたが、新しいことをやったほうがいいですね。

Pythonの基礎 オブジェクト(クラス)

オブジェクトの使い方

オブジェクトとは?

変数や関数を、ひとまとまりにしたもの。

よく使う例えでは

車というオブジェクト

変数

  • タイヤ
  • ボディ
  • エンジン
  • ハンドル

関数

  • タイヤの状態の取得やブレーキという操作
  • ドアが開いているかどうかのチェックや警告
  • エンジンの制御
  • ハンドルの入力にあわせたタイヤの操作

クラス関数はメソッドと呼ばれます

Pythonでも

  1. C++などと基本的には同じ考え方
  2. もちろん継承もある

クラスは設計図

インスタンス実体

とえいます

クラスを作成する

上記にあげた例と違ってすみません。

ドットインストールさんで例に挙げている、人名で書いてみます。


class Person(object):
     def __init__(self, name):
          self.name = name
     def greet(self):
          print "my name is %s " % self.name

tak = Person("Takuya")

print tak.name
tak.greet()
#実行結果
Takuya
my name is Takuya

となります。

  1. ある人をクラスで宣言する
  2. その人の名前をクラスで保持する(self.name)
  3. greet()という関数で、名前を含む挨拶の文字列が表示される

というクラスですね。

また、

  1. 保持した名前だけを直接見ることもできる

ようです

色々むずかしそうなので、ひとつひとつ見ていきましょう。

class Person(object):

これはクラスのステートメント、つまり宣言だと言えます。

Personというクラスですよ、ということですね。

引数のobjectって??

ステートメントの引数は、通常は「継承するクラス」を書きます。

で、今回は何も継承しないので引数なしでも構わないのですが、

Pythonでは全ての変数その他はobjectということなので、きっとこう書くのだと思います(多分)。

ちなみに「継承なし」で以下のように書くこともできます。

 #これでも上手くいきます
class Person:

さて、次の行にいきましょう

     def __init__(self, name):
          self.name = name

def でメソッドを定義するのですが、見慣れない__init__というのは???

これはコンストラクタのようなものだと考えます。

なので、インスタンスがが生成された時に必ず呼ばれるものということになりますね。

さらに、selfというのも不明です。

オライリーの書籍496ページによると

クラス関数(メソッド)の第一引数にはどのような特徴がありますか?

という設問の回答として

メソッドの第一引数は、必ずそのメソッドを呼び出したインスタンスになります。 この引数は慣例でselfと呼ばれます。 メソッドが処理をする際には、かならずその対象となるインスタンスオブジェクトがあるということです。

「このクラス内のメソッドだよ!」ということで、selfなんだよ、ってことでしょうか。

ということなので、少し下の行で渡される

tak = Person("Takuya")

での"Takuya"は、ここでは第二引数としてコンストラクタたる__init__に渡されることになります。

いうまでもなくnameに"Takuya"が入っているということですね。

self.name = name

このインスタンスに属する(すなわちself)のnameという変数に、引数のnameの値を代入する、という意味です。

次もクラスメソッド

     def greet(self):
          print "my name is %s " % self.name

greet()という関数を宣言、定義します。

printにはself.nameが使われます。もちろん、このインスタンスの変数たるself.nameなので"Takuya"が呼び出されるのですね。

続いて上記でも少し紹介した、「インスタンスの作成」と、クラス変数へのアクセス、クラスメソッドです

tak = Person("Takuya")

print tak.name
tak.greet()

takというインスタンスのself.nameには"Takuya"が入っているので、

print tak.name

では"Takuaya"が表示されます。

greet()では、そのself.nameを使って挨拶文の表示までを担当してくれます

my name is Takuya と表示されますね。

私なりにドットインストールのサンプルを解釈しながら説明してみました。

selfの使い方、特に引数に戸惑いますね。

selfをthisに置き換えれば、変数については理解しやすいんですね(C++, Javaプログラマは)。

まだまだこの先はクラスの継承などもあります。

先は長いですから頑張っていきましょう。

ちなみにオライリーの書籍では

初めてのPython 第3版

初めてのPython 第3版

22章 Python でのオブジェクト指向プログラミング」にあたります