如何自动调用Python类实例变量的函数?
假设我有一个叫做 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)
问题是,我希望每次我尝试给这个对象添加特定的实例变量时,能够自动运行这个函数。如果可以的话,我希望只对 weight
这个实例变量运行 change_weight
函数。
我这样理解对吗?还是说我应该把这个整数单独通过函数处理,然后再手动添加到对象里呢?
2 个回答
2
了解一下Python中的描述符的概念。特别是,你可能想要定义一个自定义的__set__()
方法。
举个例子,
obj.d
会在obj
的字典中查找d
。如果d
定义了__get__()
这个方法,那么就会根据下面列出的优先级规则调用d.__get__(obj)
。
另外,你可能会发现使用Properties
(一种特定类型的描述符)会更容易一些。
property()
是一种简洁的方法,可以创建一个数据描述符,在访问属性时会触发函数调用。
一旦你理解了描述符的工作原理,它的行为就会变得相当合理,但它的表现可能和你预期的不太一样;特别是,__get__()
和__set__()
不要和Java中的getter和setter混淆。所以在深入之前,先看看上面的例子并试着玩一玩。
6
你想使用属性
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
时,设置器函数会被调用,实际的重量会被设置为 20 - 10 = 10
。