🐍

サラッとPython入門 ~ オブジェクト指向によるクラス設計 ~

2021/01/30に公開

クラス

定義

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