プロパティーを使った属性の設定


class TeslaCar(Car)のenable_auto_runの属性を後から書き換えることが可能

qiita.py
class Car(object):
    def __init__(self,model=None):
        #ベースクラスは何も設定しない
        self.model = model

    def run(self):
        print("run")

class ToyotaCar(Car):
    def run(self):
        print("toyta_run")

class TeslaCar(Car):
    def __init__(self, model= "ModelS", enable_auto_run=False):
        super().__init__(model)
        self.enable_auto_run=enable_auto_run

    def run(self):
        print("tesla_run")

tesla_car = TeslaCar("modelS")
print(tesla_car.enable_auto_run)
tesla_car.enable_auto_run = True
print(tesla_car.enable_auto_run)

外から書き換えられたくないとき

pythonでは_は『外から見えないようにする』という意味がある

qiita.py
self._enable_auto_run
qiita.py
class TeslaCar(Car):
    def __init__(self, model= "ModelS", enable_auto_run=False):
        super().__init__(model)
        self._enable_auto_run=enable_auto_run

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

このように書き換えることで読み込みはできるが書き込みはできなくなる
この状態で書き換えようとすると

再度書き換えを可能にするには次のファンクションを追加する必要がある

qiita.py
    @enable_auto_run.setter
    def enable_auto_run(self, is_enable):
        self._enable_auto_run = is_enable

この後、次のように書くと引数にTrueが入る

qiita.py
tesla_car.enable_auto_run = True

使い所

外からの書き換えの制限をかける時など

qiita.py
class TeslaCar(Car):
    def __init__(self, model= "ModelS", enable_auto_run=False,passwd =456):
        super().__init__(model)
        self._enable_auto_run=enable_auto_run
        self.passwd = passwd

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

    @enable_auto_run.setter
    def enable_auto_run(self, is_enable):
        if self.passwd == 456:
            #パスワードが456のときのみ外からの書き換えを可能
            self._enable_auto_run = is_enable
        else:raise ValueError
        #それ以外はエラー

さらに進んで
アンダースコアを二つ繋げると、生成後はアクセスできなくなる

qiita.py
self.__enable_auto_run=enable_auto_run

注意点

存在しない属性を付け加えることができる為、付け加える前にクラスの中身を確認する必要がある

qiita.py
class T(object):
    pass
t=T()
#インスタンス化
t.name = "kirin"
t.age = 20
print(t.name,t.age)
#kirin,20