Skip to main content
 首页 » 编程设计

Python:访问对象的特定属性时如何做额外的事情

2025年05月04日12JeffreyZhao

假设我有一个 Python 类:

class Foo(object): 
    a = 1 
    b = 2 

当我访问“a”而不是“b”时,我想做一些额外的事情。因此,例如,假设我想做的额外事情是增加属性的值:

> f = Foo() 
> f.a # Should output 2 
> f.a # Should output 3 
> f.a # Should output 4 
> f.b # Should output 2, since I want the extra behavior just on 'a' 

感觉好像有一种方法可以通过 __getattr__ 或 __getattribute__,但我想不通。

额外的东西可以是任何东西,不一定与属性相关(比如 print 'Hello world')。

谢谢。

请您参考如下方法:

您正在寻找的是 property ,可以很好地用作装饰器:

class Foo(object): 
    _a = 2 
 
    @property 
    def a(self): 
        Foo._a += 1 
        return Foo._a - 1 
 
    b = 2 

每当您尝试访问 foo_instance.a 时都会调用该函数,并且返回的值用作属性的值。您也可以定义一个 setter,它会在设置属性时使用新值调用。

这是假设您想要奇怪的类属性设置,您只能从实例中访问它。 (此处的 _a 和 b 属于该类 - 也就是说,所有实例仅共享一个变量 - 如您的问题所示)。但是,属性始终是实例拥有的。最有可能的情况是您确实想要:

class Foo(object): 
    def __init__(self): 
        self._a = 2 
        self.b = 2 
 
    @property 
    def a(self): 
        self._a += 1 
        return self._a - 1 

它们是实例属性。