打印一个不起作用的房产的吸气剂?

p3o*_*lem 0 python properties decorator python-decorators

我是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
Run Code Online (Sandbox Code Playgroud)

我得到的输出是 set speed to 170

这一切都很好,从那以后car1.speed就没有任何意外了.但是,为什么从来没有"The speed is 170"印刷线呢? car1.speed是以同样的方式被召唤?有什么我不明白的吗?

Mar*_*ers 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))
Run Code Online (Sandbox Code Playgroud)

print()呼叫 return语句:

def get_speed(self):
    print("the speed is {}".format(self._speed))
    return self._speed
Run Code Online (Sandbox Code Playgroud)

我纠正了print()显示功能self._speed(在属性名下划线),否则你会进入一个无限递归(因为self.speed会再次触发属性getter).您可能希望在set_speed()函数中执行相同操作,因为它也会触发get_speed()getter并且每次更改速度时都会看到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)
Run Code Online (Sandbox Code Playgroud)

接下来,您可以将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))
Run Code Online (Sandbox Code Playgroud)

请参阅@property装饰器如何工作?至于如何运作.