假设我有一个 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
它们是实例属性。
