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

iuy*_*sal 1 python

假设我有一个Python类:

class Foo(object):
    a = 1
    b = 2
Run Code Online (Sandbox Code Playgroud)

当我访问'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'
Run Code Online (Sandbox Code Playgroud)

感觉有一种方法可以通过__getattr__或__getattribute__,但我无法理解这一点.

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

谢谢.

Gar*_*tty 8

您正在寻找的是一个属性,可以很好地用作装饰者:

class Foo(object):
    _a = 2

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

    b = 2
Run Code Online (Sandbox Code Playgroud)

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

这假设你想要从实例访问的类属性的奇怪设置.(_ab这里属于类-也就是说,只有一个由所有实例共享变量-在你的问题).但是,属性始终是实例拥有的.最可能的情况是你真的想要:

class Foo(object):
    def __init__(self):
        self._a = 2
        self.b = 2

    @property
    def a(self):
        self._a += 1
        return self._a - 1
Run Code Online (Sandbox Code Playgroud)

它们是实例属性的位置.