Python基本文法まとめ(8) クラスの使い方について

自分(初心者)用のPython3の基本文法備忘録。
第8回目はクラスの使い方について

Python3-クラス

クラスの書式

クラスの定義

Pythonのクラスは、 class クラス名:  で定義し、以下のブロックにメソッドやプロパティを記述する。
class クラス名:
    メソッド
    プロパティ など

メソッド

メソッドを作るには、クラス内でdef文を記述する。
class Test:
    def word(self, word):
        self.word = word
        
    def say(self):
        print(self.word)

test = Test()
test.word('Hello')
test.say()

コンストラクタ

Pythonのコンストラクタは、 def /__init__(self,引数1, 引数2, ・・・) と定義する。
class Employee:
    コンストラクタ
    def __init__(self, number, sex, name):
        self.__number = number
        self.__sex = sex
        self.__name = name
    
    #メソッド
    def show_number(self):
        print(str(self.__number))

john = Employee(1234, 'male', 'John Doe')
john.show_number()

#結果
1234

デストラクタ

Pythonのデストラクタは、 def __del__(self) で定義する。
class クラス名:
    #デストラクタ
    def __del__(self):
        処理

カプセル化

変数やメソッドの前に__(アンダースコアを2つ)をつけることでカプセル化することができる。

カプセル化をした変数に外部からアクセスするには、ゲッターとセッターを用いる。

ゲッターとセッター

ゲッターとは、隠蔽されている変数を外部から取得すること。そのためのメソッドをゲッターメソッドという。

セッターとは、隠蔽されている変数に外部から値を設定すること。そのためのメソッドをセッターメソッドという。

ゲッターメソッドとセッターメソッドをあわせてアクセッサメソッドという。
class Employee:
    #コンストラクタ
    def __init__(self, number, sex, name):
        self.__number = number
        self.__sex = sex
        self.__name = name
    
    #sexのゲッターメソッド
    def get_sex(self):
        return self.__sex
    
    #sexのセッターメソッド
    def set_sex(self, sex):
        self.__sex = sex
    
    #メソッド
    def show_number(self):
        print(str(self.__number))

#Emploeeクラスからjohnインスタンスを生成
john = Employee(1234, 'male', 'John Doe')

#sexの初期値を取得
sex = john.get_sex()
print(sex)

#sexを上書きする
john.set_sex('female')
sex = john.get_sex()
print(sex)

#結果
male
female

プロパティ

プロパティ関数を使うとゲッターとセッターを使わないで、普通の変数のように使うことができる。

デコレーター

@propertyというデコレーターでゲッターに、@ゲッター名.setterというデコレーターでセッターにproperty関数で定義したのと同様の働きを持たせることができる。
class Employee:
    #コンストラクタ
    def __init__(self, number, sex, name):
        self.__number = number
        self.__sex = sex
        self.__name = name
    
    #numberのゲッターメソッド
    def get_number(self):
        return self.__number
    
    #numberのセッターメソッド
    def set_number(self, number):
        self.__number = number
    
    #sexのゲッターメソッド
    def get_sex(self):
        return self.__sex
    
    #sexのセッターメソッド
    def set_sex(self, sex):
        self.__sex = sex
        
    #sexのproperty
    sex = property(get_sex,set_sex)
    
    #nameのゲッターメソッド
    @property
    def name(self):
        return self.__name
    
    #nameのセッターメソッド
    @name.setter
    def name(self, name):
        self.__name = name
    
#Emploeeクラスからjohnインスタンスを生成
john = Employee(1234, 'male', 'John Doe')

#numberの初期値を取得
number = john.get_number()
print(number)

#numberを上書きする
john.set_number(4321)
name = john.get_number()
print(name)

#sexの初期値を取得
sex = john.sex
print(sex)

#sexを上書きする
john.sex = 'female'
sex = john.sex
print(sex)

#nameの初期値を取得
name = john.name
print(name)

#nameを上書き
john.name = 'Jane Doe'
name = john.name
print(name)

#結果
1234
4321
male
female
John Doe
Jane Doe

変数

メソッドの内部に記述した変数はインスタンス変数となり、メソッドの外部に記述した変数はクラス変数となる。

外部からクラス変数にアクセスするには、クラス名.クラス変数でアクセスする。インスタンスを生成している場合はインスタンス名.クラス変数でもアクセスできる。

クラス変数、インスタンス変数ともにクラスの外側から追加することができる。
class Employee:
    #クラス変数
    country = 'Japan'
    
    #コンストラクタ
    def __init__(self, number, sex, name):
        self.__number = number
        self.__sex = sex
        self.__name = name
    
    #numberのゲッターメソッド
    def get_number(self):
        return self.__number
    
    #numberのセッターメソッド
    def set_number(self, number):
        self.__number = number
    
    #sexのゲッターメソッド
    def get_sex(self):
        return self.__sex
    
    #sexのセッターメソッド
    def set_sex(self, sex):
        self.__sex = sex
        
    #sexのプロパティ
    sex = property(get_sex,set_sex)
    
    #nameのゲッターメソッド
    @property
    def name(self):
        return self.__name
    
    #nameのセッターメソッド
    @name.setter
    def name(self, name):
        self.__name = name
    
#インスタンス生成前でもクラス変数にアクセスできる
print(Employee.country)

#Emploeeクラスからjohnインスタンスを生成
john = Employee(1234, 'male', 'John Doe')

#インスタンス生成後はインスタンス名.変数でアクセスできる
print(john.country)

#Employeeクラスにメソッドを追加する
def say(self, word):
    print(word)

Employee.say = say
john.say('Hello')

#Emploeeにクラス変数を追加する
Employee.section = 'accounting'
print(Employee.section)
print(john.section)

#johnにインスタンス変数を追加する
john.position = 'manager'
print(john.position)

#結果
Japan
Japan
Hello
accounting
accounting
manager




継承

Pythonでは、スーパークラスからサブクラスを作るだけでなく、複数のクラスから1つのサブクラスを作る多重継承や、Pythonの組み込み型のクラスを継承することもできる。

継承の書式

多重継承継承の場合は、()内にカンマ区切りで複数のスーパークラスを指定する。
組み込み型の継承の場合は、スーパークラスの指定に組み込み型を指定するだけ。
class サブクラス名(スーパークラス名):
    サブクラスの定義

継承を使った例文

Employeeを継承してPresidentクラスを定義。
class Employee:
    #クラス変数
    country = 'Japan'

    #コンストラクタ
    def __init__(self, number, sex, name):
        self.__number = number
        self.__sex = sex
        self.__name = name

    #numberのゲッターメソッド
    def get_number(self):
        return self.__number

    #numberのセッターメソッド
    def set_number(self, number):
        self.__number = number

    #sexのゲッターメソッド
    def get_sex(self):
        return self.__sex

    #sexのセッターメソッド
    def set_sex(self, sex):
        self.__sex = sex

    #sexのプロパティ
    sex = property(get_sex,set_sex)

    #nameのゲッターメソッド
    @property
    def name(self):
        return self.__name

    #nameのセッターメソッド
    @name.setter
    def name(self, name):
        self.name = name

#Employeeを継承したPresidentクラスの定義
class President(Employee):
    #Presidentのコンストラクタ
    def __init__(self, number, sex, name, rich = True):
        #スーパークラスからnumber、sex、nameを継承
        super().__init__(number, sex, name)
        #新しい属性を定義
        self.__rich = rich
    
    #richのプロパティ
    @property
    def rich(self):
        return self.__rich
    
    #Presidentのメソッド
    def fire(self, name):
        print('{}はクビだ!'.format(name))

boss = President(9999, 'male', 'Python')
print(boss.get_number())
print(boss.sex)
print(boss.name)
print(boss.rich)
boss.fire('john')

#結果
9999
male
Python
True
johnはクビだ!



今回はここまで。

最近よく思う。プラグラミングって楽しいって。

なんでもっと早く初めなかったんだろう。

とにかく前進あるのみ!

0 件のコメント :