假设我有一个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').
谢谢.
您正在寻找的是一个属性,可以很好地用作装饰者:
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.
这假设你想要从实例访问的类属性的奇怪设置.(_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
Run Code Online (Sandbox Code Playgroud)
它们是实例属性的位置.