Python 基礎 第15回 クラスの応用①

目次

クラスをさらに使いこなすために

前回の記事では Python におけるクラスの基本的な定義や属性、メソッドの使い方について紹介しました。クラスにはまだまだ、学ぶことでより便利になる機能があるため、今回と次回の記事ではその中の機能をいくつか紹介していきます。

Python の記事一覧はこちら

コンストラクタ

コンストラクタとは「インスタンスが作成されるときに最初に必ず処理されるメソッド」です。コンストラクタは、「__init__」という名前を持つメソッドとしてクラス内に定義することで使用することができます。さっそくサンプルコードを見てみましょう。

class Person:
    # コンストラクタ
    def __init__(self, name, age):
        self.name = name
        self.age = age

    # 人物情報の設定
    def getName(self):
        return self.name
    
    def getAge(self):
        return self.age
    
    # 動作の設定
    def swingBat(self):
        print(self.name, "はバットを振った")

    def bunt(self):
        print(self.name, "はバントした")

    def run(self):
        print(self.name, "は走った")

pr = Person("太郎", 23)
# pr.name = "太郎" 
# pr.age = 23
pr.swingBat()
pr.bunt()
pr.run()

コンストラクタはインスタンスの作成と同時に実行され、定義時の記述である

インスタンス名 = クラス名( 引数1, 引数2,… )

の( )内に指定した引数がコンストラクタに渡されるという仕組みになっています。上記のコードでは引数1に「太郎」、引数2に「23」と記載しているため、コンストラクタのselfを飛ばした(selfは引数を受け取りません)1番目の引数nameに「太郎」2番目の引数ageに「23」が渡され、コンストラクタの処理によってそれぞれの属性へ値が代入されます。

コンストラクタを利用することによって、前回の記事で紹介したような pr.name = “太郎” や pr.age = 23 などの記述をする必要がなくなります。このように属性への値の代入以外にも、インスタンスが作成されるときに行いたい処理を記述しておくとさらにクラスを便利に活用することが出来ます。

カプセル化

クラスとは、「モノの概念に着目する」と前回の記事で紹介しました。このようにプログラムを設計していく方法のことを、「オブジェクト指向」と呼んでいます。

そう考えたとき、下記のようなコードが間違って記述されてしまったりすると、不具合が生じてしまいます。

class Person:
    # コンストラクタ
    def __init__(self, name, age):
        self.name = name
        self.age = age

    # 人物情報の設定
    def getName(self):
        return self.name
    
    def getAge(self):
        return self.age
    
    # 動作の設定
    def swingBat(self):
        print(self.name, "はバットを振った")

    def bunt(self):
        print(self.name, "はバントした")

    def run(self):
        print(self.name, "は走った")

pr = Person("太郎", 23) 
pr.age = -24

インスタンスの生成後年齢を1つ増やそうとするも誤って -24 と記述してしまうと、現実世界の人物ではありえない状況になってしまいます。このためオブジェクト指向では、このような誤った値が設定されないようなしくみとしておくことが求められています。

属性へのアクセスを制限するには、下記のようにクラスを定義します。

class Person:

    def __init__(self, name, age):
        self.__name = name
        self.__age = age

    # 人物情報の設定
    def getName(self):
        return self.name
    
    def getAge(self):
        return self.age
    
    # 動作の設定
    def swingBat(self):
        print(self.name, "はバットを振った")

    def bunt(self):
        print(self.name, "はバントした")

    def run(self):
        print(self.name, "は走った")

コンストラクタ内の処理に注目してください。属性の変数名をアンダースコア2つ(__)で始まる単語にすることでクラスの外部からアクセスすることが出来なくなります。このように、属性の名前が別の名前に変更されてアクセスできないようになる Python の仕組みは、「マングリング」と呼ばれています。 Python はこうしたシンプルな方法でオブジェクト指向を実現しています。

セッターとゲッターの利用

カプセル化を行うことによってクラス外から属性の変更が出来なくなることを紹介しました。カプセル化を行うだけだと、コンストラクタで設定した属性の値から変更ができないということになります。このとき、「セッター」と「ゲッター」という機能を使用することでカプセル化を行った状態でもインスタンスの属性へアクセスすることが出来ます。

class Person:

    def __init__(self, name, age):
        self.__name = name
        self.__age = age

    def set_Name(self, name): # nameセッター
        self.__name = name # カプセル化している

    def set_Age(self, age): # ageセッター
        self.__age = age # カプセル化している

    def get_Name(self): # nameゲッター
        return self.__name

    def get_Age(self): # ageゲッター
        return self.__age

    pro_age = property(get_Age, set_Age)
    pro_name = property(get_Name, set_Name)

pr = Person("太郎", 23)

pr.__age = -24 # 変更できない
print(pr.get_Age) # 出力できない

pr.pro_age = 24 # プロパティ経由で属性を設定

print(pr.pro_age)

1つの属性に対して、「値を代入するメソッド(セッター)」と「値を取得するメソッド(ゲッター)」を定義します。
そして、それらのメソッドを呼び出す処理として

変数名 = property( )

を別途定義しています。クラス外での属性へのアクセスは property( ) の戻り値を格納している変数を使って行うことが出来ます。

「コンストラクタ」「カプセル化」「セッター、ゲッター」をうまく活用し、クラスをより効果的に使えるようにしましょう。

(Visited 204 times, 1 visits today)
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

株式会社NEUGATEは、都内で企業研修や職業訓練を運営している会社です。主に、IT系の教育事業に力を入れています。
この記事は、株式会社NEUGATEの教育事業部が執筆をしています。

企業ホームページ:https://neugate.co.jp/

コメント

コメントする

目次