【问题标题】:Print in getter of a property not working?在属性的吸气剂中打印不起作用?
【发布时间】:2017-01-26 05:59:06
【问题描述】:

我是 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 以同样的方式被调用?有什么我不明白的吗?

【问题讨论】:

    标签: python properties decorator python-decorators


    【解决方案1】:

    您在print() 调用之前使用了return 语句。函数执行结束到那时,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() getter,并且您会在每次更改速度时看到在打印 set speed to <newspeed> 之前打印 the speed is <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() 方法,然后也可以重新使用它来装饰 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? 了解其工作原理。

    【讨论】:

    • 哇,真是个大错。谢谢。
    猜你喜欢
    • 2019-11-26
    • 1970-01-01
    • 2017-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    • 2021-07-19
    相关资源
    最近更新 更多