2017年12月26日火曜日

[Python] オブジェクト指向

標準ライブラリの利用
Pythonをインストールした際に,最初から入っているライブラリは標準ライブラリと呼ばれます.標準ライブラリ内では,関連する機能の塊は,モジュールという単位で提供されます.

以下に,標準ライブラリのクラスとして,datetimeモジュールに含まれるdataの例を示します.
>>> import datetime
>>> d = datetime.date(2017, 12, 26)
>>> d.year
2017
>>> d.weekday()
1
>>> 
dateクラスは日付を表現するためのクラスで,上記の例では
datetime.date 
(モジュール名).(クラス名)
の形式で呼び出しています.ここでは,2017年12月26日に相当するインスタンスを生成しています.

インスタンスへのアクセスは全て属性を通して行われます.属性は上記の例では
d.year
(インスタンスを表す変数).(属性名)
のように,インスタンスを表す変数にピリオド( . )と属性名で指定されます.d.year はインスタンス d 内の year 属性を参照するという命令です.例における year のような属性はデータ属性,またはプロパティと呼ばれます.
d.weekend() はインスタンス d 内のweekend 属性を呼び出しています.このような属性はメソッドと呼ばれています.メソッドは"()"とともに,場合によっては引数付きで呼ばれます.一方,データ属性は属性名のみでアクセスできます.

クラス定義
上記では標準ライブラリ(すなわち既存のクラス)について説明しました.既存のものではなく自分でクラスを作成することも可能です.

まずはデータ属性しか持たないクラスの例(ここでは Person という名前にしています)を示します.
>>> class Person: 
...     def __init__(self, first_name = "", last_name = ""): 
...             self.first_name = first_name
...             self.last_name = last_name
... 
>>> 
>>> person1 = Person("John", "Smith")
>>> print(person1.first_name, person1.last_name)
John Smith
>>> 
>>> person2 = Person()
>>> person2.first_name = "Robert"
>>> person2.last_name = "Johnson"
>>> print(person2. first_name, person2.last_name)
Robert Johnson
__init__はコンストラクタと呼ばれ,クラスのインスタンス化の際に呼ばれます.__init__の最初の引数はselfで,これは自分自身を表す変数です.self はメソッドを定義する際には必ず必要になります.
上記の例では
__init__(self, first_name = "", last_name = ""): 

のように引数が3つあります.最初は先述の self です.後の2つが実質的に外から与えることのできる引数で,上記の例では2つの引数  first_name, last_name にデフォルト値が設定されています.first_name,last_nameなどはクラスのインスタンスに付随するデータ属性です.

クラスを定義した後の
person1 = Person("John", "Smith")

では,Personクラスをインスタンス化して変数person1に代入しています.(2番目以降の引数には"John"と"Smith"が与えられており,インスタンス内のデータ属性には"John"と"Smith"が設定されていることになります.なので,その次の行の
print(person1.first_name, person1.last_name)

という命令の結果,引数(クラスのインスタンスに付属するデータ属性である John とSmith)が表示されています.

その次の
person2 = Person()

ではデフォルト値を利用してインスタンスを作成しています.インスタンスを上記の命令で作成した後に,
person2.first_name = "Robert"
person2.last_name = "Johnson"

データ属性に直接代入することでデータ属性の値を置き換えています.

続いて,上記のコード(Personクラス)にメソッドを追加してみます.追加するメソッドはget_nameという名前をつけたものと,__str__メソッドです.
>>> class Person:
...     def __init__(self, first_name = "", last_name = ""):
...             self.first_name = first_name
...             self.last_name = last_name

...     def get_name(self):
...             return self.first_name + " " +self.last_name

...     def __str__(self):
...             return self.last_name + ", " + self.first_name
ここで get_name というメソッドは,first_name と last_name をスペースで繋いだ文字列を返します.get_name を呼び出すときは,インスタンス person1 に対して,person1.get_name() のように明示的にメソッドを呼び出しています.
>>> print(person1.get_name())
John Smith

また,print(person1)とすると,person1の__str__メソッドが呼び出されます.このように明示的に指定しなくても呼び出されるメソッドのことを特殊メソッドと呼びます.
特殊メソッドはアンダースコア2つ( __ )で始まり,アンダースコア2つで終わるメソッド名を持ち,どのような時にどの特殊メソッドが呼ばれるかは決まっています.
__str__ という特殊メソッドは,print の引数に与えられたときなどの,文字列型への暗黙的変換が行われるときに呼び出されるメソッドです.
>>> print(person1)
Smith, John

上記のコードや内容は機械学習のエッセンスを参考にしています.

0 件のコメント :

コメントを投稿