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是以同样的方式被召唤?有什么我不明白的吗?
你在通话前使用了一个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装饰器如何工作?至于如何运作.