Pythonに挑戦(9)その(3)

Pythonに挑戦(9)その(2)からの続き

(7) class
Pythonのようなオブジェクト指向言語では、クラスというものを使います。クラスは、1つの物であって、データ構造と処理を両方持っています。処理をメソッドと言います。クラスは抽象的概念と言えますが、そのクラスのデータ構造の実際のデータをもつ実例をインスタンスと言います。インスタンスの処理は、クラスの処理が使われます。
各クラスには通常、インスタンスを作るためのコンストラクタと呼ばれるメソッド
__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):
というようにします。myclass.e1.append(“message”)とすれば、appendが実行されて、myclass.e1[0]“message”になります。ですが、インスタンスm1e1に書き込もうとして、m1.e1.append(“messaage”)とすると、エラーになります。str1 = m1.e1[0]として読み出すことはできます。インスタンスに変数(インスタンス変数と言います)を用意する場合には、コンストラクタの中に変数の定義を置きます。上記の例では、m1.name“name1”になっていますが、m1.nameはインスタンス変数で、m1.name = “name2”という具合に書き換えることができます。クラスとして保持しているデータ(クラス変数)なのか、インスタンスごとに用意されているデータ(インスタンス変数)なのかを区別する必要があります。
クラスにクラス固有の関数
(メソッド)を定義するときには、

class myclass:
e1 = []
def __init__(self, s1):
self.name = s1
self.e2 = []
def mymethod(self, s2):
self.e2.append(s2)
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
で、生成されたインスタンスm1を削除することができます(__del__()をデストラクタと言います)
上記で、
myclassの定義直後に出てくるe1 = []は、クラス変数と言います。myclassのすべてのインスタンスに共通の変数です。クラス変数にアクセスする場合は、myclass.e1としてクラス名をつけてアクセスします。
myclass.e1.append(“apple”)
print(myclass.e1)
とすると、画面に、
[‘apple’]
と表示されます。それに対して、コンストラクタ、メソッドの中で定義される変数、self.nameself.e2は、インスタンス変数と言い、インスタンスごとに異なる値を持ちます。インスタンス変数にアクセスする場合は、インスタンス名m1を付けて、m1.namem1.e2のようにしてアクセスします。
上記の
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()
とすると、画面に、

名前は: efghij
サブクラスのname efghij
と表示されます。

Pythonに挑戦(9)その(4)に続く


  ブログTOP  TOPページに戻る


各問題の著作権は
出題大学に属します。

©2005-2024
(有)りるらる
苦学楽学塾 随時入会受付中!
理系大学受験ネット塾苦学楽学塾
(ご案内はこちら)ご入会は、
まず、こちらまでメール
お送りください。


【広告】 ここから広告です。ご覧の皆さまのご支援ご理解を賜りたく、よろしくお願いいたします。
【広告】 広告はここまでです。
スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする