Pythonに挑戦(9)その(2)からの続き
(7) class
Pythonのようなオブジェクト指向言語では、クラスというものを使います。クラスは、1つの物であって、データ構造と処理を両方持っています。処理をメソッドと言います。クラスは抽象的概念と言えますが、そのクラスのデータ構造の実際のデータをもつ実例をインスタンスと言います。インスタンスの処理は、クラスの処理が使われます。
各クラスには通常、インスタンスを作るためのコンストラクタと呼ばれるメソッド__init__(self)というメソッドが付属します。selfというのは自分自身、という意味です。
クラスの記述を行っているモジュールをmodule1とすると、クラスを使うためには、クラスを使うところよりも前に、
各クラスには通常、インスタンスを作るためのコンストラクタと呼ばれるメソッド__init__(self)というメソッドが付属します。selfというのは自分自身、という意味です。
クラスの記述を行っているモジュールをmodule1とすると、クラスを使うためには、クラスを使うところよりも前に、
import module1
を置きます。同一ファイルのプログラム内でクラス定義を行う場合には、クラスを使うところの前に、クラス定義を置きます。module1の中の、myclassというクラスのインスタンスを“name1”という名前をつけて作る場合、
m1 = module1.myclass(“name1”)
とすると、クラスmyclassのインスタンスm1が作成されます。クラス定義が同一ファイル内にあるなら、m1 = myclass(“name1”)でOKです。このときに呼び出されるのが、myclassのコンストラクタ__init__(self)です。myclassでは、名前文字列という引数を持つので、myclassの定義の中で、
class myclass:
def __init__(self, s1):
self.name = s1
という記述を行います。これで引数の名前を、インスタンス自身のnameという属性(プロパティと言います)に保持します。上記の例では、m1.nameが“name1”になります。Pythonでは代入が行われるときにデータ領域を確保するので、あらかじめ、どういうプロパティを持つのかを宣言する必要はありません。
クラス自体に変数
(クラス変数と言います)を用意する場合は、クラス宣言のすぐ後ろに、変数を定義します。リストe1を作るのであれば、class myclass:
e1 = []
def __init__(self):
def __init__(self):
というようにします。myclass.e1.append(“message”)とすれば、appendが実行されて、myclass.e1[0]が“message”になります。ですが、インスタンスm1のe1に書き込もうとして、m1.e1.append(“messaage”)とすると、エラーになります。str1 = m1.e1[0]として読み出すことはできます。インスタンスに変数(インスタンス変数と言います)を用意する場合には、コンストラクタの中に変数の定義を置きます。上記の例では、m1.nameが“name1”になっていますが、m1.nameはインスタンス変数で、m1.name = “name2”という具合に書き換えることができます。クラスとして保持しているデータ(クラス変数)なのか、インスタンスごとに用意されているデータ(インスタンス変数)なのかを区別する必要があります。
クラスにクラス固有の関数(メソッド)を定義するときには、
クラスにクラス固有の関数(メソッド)を定義するときには、
class myclass:
e1 = []
def __init__(self, s1):
def __init__(self, s1):
self.name = s1
self.e2 = []
self.e2 = []
def mymethod(self, s2):
self.e2.append(s2)
return len(self.e2)
return len(self.e2)
def dispname(self)
print(“名前は:“, self.name)
というように、defに続けてメソッド名、引数を書きます。最初の引数はselfになります。メソッドの末尾には通常return文が来ます。return文には戻り値を付けることができます。return文を省略すると、戻り値はありません。コンストラクタ__init__()の戻り値は、インスタンス自身です。上記の例のメソッドmymethodでは、リストe2の大きさを返すようになっています。インスタンスm1について、このmymethodを呼び出すときは、
len1 = m1.mymethod(“information1”)
とすると、appendが実行されて、m1.e2[0]が“information1”になり、リストe2の大きさ1が戻り値としてlen1に入ります。
また、インスタンスを消去するメソッドも用意されていて、クラス定義の中で、
また、インスタンスを消去するメソッドも用意されていて、クラス定義の中で、
class myclass:
def __init__(self, s1):
self.name = s1
def __del__(self):
pass
としておくと、
m1 = myclass(“name1”)
del m1
del m1
で、生成されたインスタンスm1を削除することができます(__del__()をデストラクタと言います)。
上記で、myclassの定義直後に出てくるe1 = []は、クラス変数と言います。myclassのすべてのインスタンスに共通の変数です。クラス変数にアクセスする場合は、myclass.e1としてクラス名をつけてアクセスします。
上記で、myclassの定義直後に出てくるe1 = []は、クラス変数と言います。myclassのすべてのインスタンスに共通の変数です。クラス変数にアクセスする場合は、myclass.e1としてクラス名をつけてアクセスします。
myclass.e1.append(“apple”)
print(myclass.e1)
print(myclass.e1)
とすると、画面に、
[‘apple’]
と表示されます。それに対して、コンストラクタ、メソッドの中で定義される変数、self.nameやself.e2は、インスタンス変数と言い、インスタンスごとに異なる値を持ちます。インスタンス変数にアクセスする場合は、インスタンス名m1を付けて、m1.name,m1.e2のようにしてアクセスします。
上記のmyclassのサブクラスchildclassを作る場合は、クラス継承を明示して、
上記のmyclassのサブクラスchildclassを作る場合は、クラス継承を明示して、
class childclass(myclass):
とします。親クラスのメソッドを使う場合には、super()関数を用いて、super().dispnameとします。
class childclass(myclass):
def __init__(self, name):
super().__init__(name)
self.name2 = “★” + self.name
def childmethod(self):
super().dispname()
print(“サブクラスのname:“, self.name2)
m2 = childclass(“efghij”)
m2.childmethod()
def __init__(self, name):
super().__init__(name)
self.name2 = “★” + self.name
def childmethod(self):
super().dispname()
print(“サブクラスのname:“, self.name2)
m2 = childclass(“efghij”)
m2.childmethod()
とすると、画面に、
名前は: efghij
サブクラスのname: ★efghij
サブクラスのname: ★efghij
と表示されます。