擅长:python、mysql、java
<p>考虑一下这个程序:</p>
<pre><code>from functools import wraps
def dec1(fn):
@wraps(fn)
def wrap(*args, **kw):
print "dec1", fn.__name__
return fn(*args, **kw)
return wrap
def dec2(fn):
@wraps(fn)
def wrap(*args, **kw):
print "dec2", fn.__name__
return fn(*args, **kw)
return wrap
class C(object):
prop = None
@property
def foo(self):
return self.prop
@foo.setter
@dec1
def foo(self, x):
self.prop = x
class D(C):
foo = property(
C.foo.fget,
dec2(C.foo.fset),
C.foo.fdel)
print '.'
c=C()
c.foo = 7
print '.'
d = D()
d.foo = 8
print '.'
</code></pre>
<p>foo是从C.foo继承get和delete函数的属性,但包装了set函数。在</p>
<p><code>D</code>的另一个定义是:</p>
^{pr2}$
<p>无论哪种情况,程序的输出都是:</p>
<pre class="lang-none prettyprint-override"><code>.
dec1 foo
.
dec2 foo
dec1 foo
.
</code></pre>
<p>注意,<code>c.foo</code>的赋值调用一个包装器,而对<code>d.foo</code>的赋值同时调用这两个包装器。在</p>