🐍

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

2 min read

クラス

定義

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("In case of bulldog, name is {} and age is {}".format(bulldog.name, bulldog.age))
print("In case of bullterrier, name is {} and age is {}".format(bullterrier.name, bullterrier.age))
print("In case of dalmatian, name is {} and age is {}".format(dalmatian.name, 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

ログインするとコメントできます