nprogram’s blog

気ままに、プログラミングのトピックについて書いていきます

Pythonでプライベートメンバ変数をクラスに定義する [Python]

Pythonのプロパティを使う方法

Pythonでは、クラスのカプセル化を実現する際は、プロパティを用いるほうがいいと思います。

getter, setterを作ったとしても、使用者側がそれを使ってくれる保証がありません。(´;ω;`)

あまり良くない書き方 その3 getter/setter - Python学習講座

コード

class Car(object):
    def __init__(self, model=None):
        self.model = model

    def run(self):
        print('run')


class ToyotaCar(Car):
    def run(self):
        print('fast')


class TeslaCar(Car):
    def __init__(self, model="Model S", enable_run=False):
        # 親のinit関数を呼び出す
        super().__init__(model)
        # プライベートメンバ変数
        self.__enable_auto_run = enable_run

    @property
    def enable_auto_run(self):
        return self.__enable_auto_run

    @enable_auto_run.setter
    def enable_auto_run(self, is_enable):
        self.__enable_auto_run = is_enable

    def run(self):
        print('super fast')

    def auto_run(self):
        print('auto_run')

car = Car()
car.run()

print('########')

toyota_car = ToyotaCar('Lexus')
print(toyota_car.model)
toyota_car.run()

print('########')

# コンストラクタで、プライベートメンバ変数(__enable_auto_run)に対して、Falseの値をセットする
tesula_car = TeslaCar('Model_S', False)
print(tesula_car.enable_auto_run)

# Setterを通して、プライベートメンバ変数(__enable_auto_run)に対して、Trueの値をセットする
tesula_car.enable_auto_run = True
print(tesula_car.enable_auto_run)

出力イメージ

run
########
Lexus
fast
########
False
True