如何自动调用Python类实例变量的函数?

0 投票
2 回答
4602 浏览
提问于 2025-04-18 05:55

假设我有一个叫做 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

撰写回答