Python3入門(7)オブジェクトとクラス

lecture

Pythonはオブジェクト指向言語です。classが雛形となりそれをインスタンス化するものです。
オブジェクトとはざっくり言って変数(プロパティ)と関数(メソッド)をまとめたものと考えることもできます。
オブジェクト志向の考え方については別の機会にするとして、ここではPythonのオリジナルのクラスの定義方法から学習します。

スポンサーリンク

クラスの作成

クラスはclassキーワードで定義します。クラス名は慣習的に先頭を大文字にします。複数の単語を繋げた名前の場合はキャメルケースを使用します。
クラス名の後に()を付けますが、引数はobjectとします。Python3では()の中のobjectを省略したり、()自体を省略することができますが、明示的にobjectを入れて使用する場合も多いです。
クラスのブロックはメソッドを定義します。メソッドはdefを使って関数の定義と同様の方法をとります。

class クラス名:
□□□□def メソッド:
□□□□□□□□メソッドの処理

クラスからのインスタンス化はクラス名と同じコンストラクタ名を使います。java言語などのようにnewを使いません。
クラスで作成したメソッドはここで作成した変数をドットで繋いでメソッドを使います。

変数 = コンストラクタ(引数1,引数2,…)

簡単なclass定義のサンプル

class Person(object):
    def say_something(self):
        print('hello')
person = Person()
person.say_something()

初期化メソッド

classをインスタンス化するときに同時に何か命令を行いたいときに初期化メソッドをclassで定義することができます。
初期化メソッドは「__init__()」で記述します。また必ず第1引数に「self」を使います。init前後のアンダースコアは2つずつ付けています。

インスタンス変数

インスタンス変数はインスタンスごとに変えることができる変数です。
クラス内のメソッドを作成し、そのメソッド内で定義するインスタンス変数は「self.変数名 = 値」の形で指定します。

class クラス名:
□□□□def 関数名(self,引数2,…):
□□□□□□□□self.引数2 = 値

classの初期化とインスタンス変数の例

class Person(object):
    def __init__(self,name):
        self.name = name
        print(self.name)
    def say_something(self):
        print('hello')
person = Person('Tahara')

クラス変数

クラスで変数宣言して、インスタンスで共有する変数をクラス変数と言います。
クラス変数の記述はクラスの中で変数の初期化を行うだけです。

class クラス名:
□□□□クラス変数 = 値

クラス変数の値を表示するには「クラス名.クラス変数名」でその値を表示することができます。
また、インスタンス化を行なった場合は、「インスタンス名.クラス変数名」でその値を表示することもできます。

クラス変数の例

class Person(object):
    first_name = 'Masaharu'
    def __init__(self,last_name):
        self.last_name = last_name
        print(self.last_name)
print(Person.first_name)
person = Person('Tahara')
print(person.first_name)
Person.first_name = 'Hoge'
print(person.first_name)

クラス変数の追加

上記サンプルに新たにageというクラス変数を追加したい場合「クラス名.変数名 = 値」とすることで、クラス作成後にいつでも変更することができます。

クラス変数の追加の例

Person.age = 30
print(Person.age)
print(person.age)

メソッドの追加

メソッドも後から追加することができます。
関数を定義して、Personクラスのアトリビュートshow_sexに作成したshow_sを代入しています。

メソッド追加の例

def show_s(self,sex):
    print(sex)
Person.show_sex = show_s
person.show_sex('men')

カプセル化

クラスの変数やメソッドを外部から変更できないようにする方法があります。一般的にクラスで設定した変数や関数を外部から変更できることはあまり好ましい事ではありません。そのため、オブジェクト志向ではカプセル化を行う事で簡単に変更できない仕組みが用意されています。
通常のオブジェクト指向言語ではpublicとprivateを使い分ける方法が用意されていますが、Pythonは少し違った方法が取られています。
Pythonでは変数やメソッドの名前の前に「__」アンダースコアを二つ繋げる方法で外部からアクセスできません。「_」アンダースコアひとつの場合は外部から変更して欲しくない場合に使用しますが。実際は変更することができます。

アクセサメソッド

カプセル化された変数に外部からアクセスする場合には特別なメソッドを用意します。値を取得するメソッドが「ゲッターメソッド」で、値を設定するメソッドを「セッターメソッド」と呼びます。またゲッターメソッドとセッターメソッドを合わせてアクセッサメソッドと呼ばれています。

通常ゲッターメソッドは「get_変数名」とし、セッターメソッドは「set_変数名」とします。

変数の前に「__」アンダースコア2つ付けて命名した例
これはエラーになり、値は表示されません。また、値を変更しようとしてもエラーになります。

class Person(object):
    __first_name = 'Masaharu'
print(Person.__first_name)

ゲッターメソッドで読み込む方法の例

class Person(object):
    __first_name = 'Masaharu'
    def get_first_name(self):
        return self.__first_name
person = Person()
print(person.get_first_name())

セッターメソッドで値をセットする例

class Person(object):
    __first_name = 'Masaharu'
    def get_first_name(self):
        return self.__first_name
    def set_first_name(self,name):
        self.__first_name = name

person = Person()
person.set_first_name('Tarou')
print(person.get_first_name())

クラスの継承

既存のクラスの機能を継承して別のクラスで活用する方法です。
継承元のクラスをスーパークラスと呼び、継承したクラスをサブクラスと呼びます。

class サブクラス名(スーパークラス):
□□□□def メソッド:
□□□□□□□□メソッドの処理

クラスの継承の例

class Car(object):
    def run(self):
        print('run')
class ToyotaCar(Car):
    def auto_run(self):
        print('auto run')

car = Car()
car.run()

toyota_car = ToyotaCar()
toyota_car.run()
toyota_car.auto_run()
タイトルとURLをコピーしました