🐍
サラッとPython入門 ~ オブジェクト指向によるクラス設計 ~
クラス
定義
class Dog:
# __init__がコンストラクタとなる。selfは自身のインスタンスを指す。
def __init__(self, name, age):
self.name = name
self.age = age
# 名前と年齢を指定して、Dogクラスをインスタンス化する
bulldog = Dog("apo", 3)
bullterrier = Dog("sparky", 4)
dalmatian = Dog("pongo", 5)
# 名前と年齢がそれぞれ設定されていることを確認
print(f"In case of bulldog, name is {bulldog.name} and age is {bulldog.age}")
print(f"In case of bullterrier, name is {bullterrier.name} and age is {bullterrier.age}")
print(f"In case of dalmatian, name is {dalmatian.name} and age is {dalmatian.age}")
In case of bulldog, name is apo and age is 3
In case of bullterrier, name is sparky and age is 4
In case of dalmatian, name is pongo and age is 5
オブジェクト指向設計
継承
# 抽象的な動物クラス
class Animal:
def __init__(self, name, age):
self.name = name
self.age = age
# 動物クラスから派生した犬クラス。動物クラスを継承するため、引数にAnimalを設定
class Dog(Animal):
# コンストラクタは動物クラスの物を使う
def __init__(self, name, age):
# super()から親クラスへアクセス可能
super().__init__(name, age)
多態性(ポリモーフィズム)
# 抽象的な動物クラス
class Animal:
def __init__(self, name, age):
self.name = name
self.age = age
def bark(self):
pass
# 動物クラスから派生した犬クラス
class Dog(Animal):
def __init__(self, name, age):
super().__init__(name, age)
def bark(self):
return "bow wow"
dog = Dog("hachi", 2)
print(dog.bark())
bow wow
# 動物クラスから派生した猫クラス
class Cat(Animal):
def __init__(self, name, age):
super().__init__(name, age)
def bark(self):
return "meow"
cat = Cat("mike", 3)
print(cat.bark())
meow
カプセル化
class Dog():
def __init__(self, name, age):
# __変数名と定義することでprivateな変数として定義可能
# privateにすることで、クラス内でしかその変数にアクセスできなくなる
self.__name = name
self.__age = age
def bark(self):
return "bow wow"
# このゲッターを介さなければ名前は取得できない
def get_name(self):
return self.__name
# nameと同様にゲッター経由でなければ年齢は取得できない
def get_age(self):
return self.__age
dog = Dog("hachi", 2)
# 正常にnameが取得できる
print(dog.get_name())
# 直接nameにアクセスできないため、エラーとなる
print(dog.name)
hachi
AttributeError: 'Dog' object has no attribute 'name'
Discussion