第8回目はクラスの使い方について
クラスの書式
クラスの定義
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 件のコメント :
コメントを投稿