2016-09-18 11 views
0

私は現在、プロパティを習得しようとしている、新しいPythonです。プロパティのgetterで印刷が機能していませんか?

class Car(object): 
    def set_speed(self, speed): 
     self._speed = speed 
     print("set speed to {}".format(self.speed)) 


    def get_speed(self): 
     return self._speed 
     print("the speed is {}".format(self.speed)) 


    speed = property(fget = get_speed, fset=set_speed) 

car1 = Car() 
car1.speed = 170 
x = car1.speed 

私が手出力はすべてが順調と罰金で、car1.speedが呼び出されたので、ここでは驚きがないset speed to 170

です。しかし、なぜそれは決して"The speed is 170"印刷ラインでしたか? car1.speedも同じ方法で呼び出されましたか?私が理解していないものはありますか?

答えて

7

returnの前に、print()コールを使用しました。関数実行は、その時点でを終了し、print()は到達しません:

def get_speed(self): 
    # return ends a function 
    return self._speed 
    # anything beyond this point is ignored 
    print("the speed is {}".format(self.speed)) 

print()コール前にreturn文入れ:

def get_speed(self): 
    print("the speed is {}".format(self._speed)) 
    return self._speed 

を私は(self._speedを表示するprint()機能を修正は属性名のアンダースコアになります)、そうでなければ無限の再帰になります(self.speedがトリガーするのでプロパティは再びgetter)。あなたができる、

class Car(object): 
    def set_speed(self, speed): 
     self._speed = speed 
     print("set speed to {}".format(speed)) 

    def get_speed(self): 
     print("the speed is {}".format(self._speed)) 
     return self._speed 

    speed = property(fget = get_speed, fset=set_speed) 

次へ:あなたは、おそらくそれはあまりにもget_speed()ゲッターを誘発するだろうとset speed to <newspeed>はあなたが速度を変更するたびに印刷される前に、あなたはthe speed is <newspeed>が印刷表示されますよう、set_speed()機能で同じことをやってみたいですpropertyオブジェクトをデコレータとして使用する;

class Car(object): 
    @property 
    def speed(self): 
     print("the speed is {}".format(self._speed)) 
     return self._speed 

    @speed.setter 
    def speed(self, speed): 
     self._speed = speed 
     print("set speed to {}".format(speed)) 

が動作する方法としてHow does the @property decorator work?を参照してください。結果propertyインスタンスは、あまりにもセッターを飾るために再利用することができsetter()方法があります。

+0

うわー、どうしたの?ありがとうございました。 – p3ob2lem

関連する問題