1

Fighterたとえば、属性の有無にかかわらず、クラスをインスタンス化したいと思いますweapon_size。しかし、属性weapon_sizeが設定されている場合 (インスタンス化時または後で)、別の属性を追加するメソッドを実行したいと思いますdamage(おそらく他の計算を行います)。以下のようにsetattr関数を オーバーロードすることでこれを実行しようとしています。

私の質問: これは正しい [そして賢明な] 方法ですか?

class Fighter(object):
    def __init__(self, prenom, weapon_size = None):
        self._prenom = prenom
        self._weapon_size = weapon_size
        if not weapon_size is None:
            self.AddWeapon(weapon_size)

    def __setattr__(self, name, value):
            if name == "weapon_size":
                print "Adding weapon"
                self.AddWeapon(value)
                self.__dict__['_' + name] = value
            else:
                self.__dict__[name] = value

    def AddWeapon(self, x):
        self._damage = x/2.

    @property
    def weapon_size(self):
        "Weapon size"
        return self._weapon_size
    @property
    def prenom(self):
        "First name"
        return self._prenom

U = Fighter('Greg')
U.weapon_size = 9
print U.weapon_size, U._damage
>> 9 4.5
W = Fighter('Jeff', weapon_size = 11)
print W.weapon_size, W._damage
>> 11 5.5
4

1 に答える 1