2016-09-18 5 views
0

Я новичок в python, в настоящее время пытаюсь изучить свойства.Печать в геттере собственности не работает?

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 

Выход я получаю set speed to 170

Это все хорошо и прекрасно, и нет ничего удивительного, так как здесь car1.speed называли. Однако почему не было печати "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() вызов перед тем возвратную заявление:

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

Я исправленную функцию print(), чтобы показать self._speed (с символ подчеркивания в названии атрибута), в противном случае вы попали бы в бесконечную рекурсию (поскольку self.speed запускает свойство снова получает). Вы, вероятно, хотите сделать то же самое в функции set_speed(), так как это будет инициировать get_speed() добытчика и вы тоже увидите the speed is <newspeed> печатается перед set speed to <newspeed> печатается каждый раз, когда вы меняете скорость:

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) 

Далее, вы можете используйте объект property как декоратор ; полученный property экземпляр имеет setter() метод, который может быть повторно использован для украшения сеттера тоже:

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? о том, как это работает.

+0

Вау, какая ошибка. Спасибо. – p3ob2lem

 Смежные вопросы

  • Нет связанных вопросов^_^