我们假设我有一个名为Car
的课程如下:
class Car(object):
"""Car example with weight and speed."""
def __init__(self):
self.weight = None
self.speed = None
如果我将Car
初始化为空对象:
red_car = Car()
我添加了speed
和weight
:
red_car.speed = 60
red_car.weight = 3500
这一切都很好但是如果我想在尝试将这些变量添加到实例时运行一个函数呢?喜欢这个功能:
def change_weight(self, any_int):
return (any_int - 10)
事情是,每当我尝试向对象添加特定的实例变量时,我希望它自动运行此函数。如果可能,我希望它仅在change_weight
实例变量上运行weight
。
我是否正确理解了这一点,还是应该单独通过函数运行整数然后手动添加到对象?
答案 0 :(得分:4)
您想要使用属性
class Car(object):
"""Car example with weight and speed."""
def __init__(self):
self._weight = None # internal value
self.speed = None
@property
def weight(self):
return self._weight
@weight.setter
def weight(self, the_weight):
self._weight = the_weight - 10 # or whatever here
现在,您可以正常设置speed
;执行car.weight = 20
时,将调用setter函数,实际权重将设置为20 - 10 = 10
。
答案 1 :(得分:2)
阅读Python的Descriptors概念。特别是,您似乎想要定义自定义__set__()
方法。
例如,
obj.d
在d
字典中查找obj
。如果d
定义方法__get__()
,则根据下面列出的优先规则调用d.__get__(obj)
。
或者,您可能会发现使用Properties
(特定类型的描述符)更容易使用。
property()
是构建数据描述符的简洁方法,可以在访问属性时触发函数调用。
描述符的行为一旦你理解它就是相当合乎逻辑的,但它并没有像你期望的那样表现得很好;特别是,__get__()
和__set__()
不应与getter和setter混淆,例如Java概念。所以看看上面的一些例子并在潜入之前玩弄它们。