'''Add decorator for each method of a class.'''
import
functools
import
threading
class
DecorateClass(
object
):
def
decorate(
self
):
for
name, fn
in
self
.
iter
():
if
callable
(fn):
self
.operate(name, fn)
class
LockerDecorator(DecorateClass):
def
__init__(
self
, obj, lock
=
threading.RLock()):
self
.obj
=
obj
self
.lock
=
lock
def
iter
(
self
):
return
[(name,
getattr
(
self
.obj, name)) \
for
name
in
dir
(
self
.obj)
if
not
name.startswith(
'_'
)]
def
operate(
self
, name, fn):
@functools
.wraps(fn)
def
locker(
*
args,
*
*
kv):
self
.lock.acquire()
try
:
return
fn(
*
args,
*
*
kv)
finally
:
self
.lock.release()
setattr
(
self
.obj, name, locker)
class
mylocker:
def
__init__(
self
):
print
(
"mylocker.__init__() called."
)
def
acquire(
self
):
print
(
"mylocker.acquire() called."
)
def
release(
self
):
print
(
" mylocker.unlock() called."
)
class
Foo(
object
):
def
__init__(
self
):
# Enable one or more decorators for each method:
LockerDecorator(
self
).decorate()
LockerDecorator(
self
, mylocker()).decorate()
def
interface1(
self
):
print
(
" interface1() called."
)
def
interface2(
self
):
print
(
" interface2() called."
)
def
_interface3(
self
):
print
(
"_interface3() called."
)
if
__name__
=
=
"__main__"
:
obj
=
Foo()
obj.interface1()
obj.interface2()
obj.interface1()
obj.interface2()
obj._interface3()
print
(obj.interface1.__name__)
'''
print(dir(obj))
print("---------------------")
for item in [(name,getattr(obj, name)) for name in dir(obj)]:
print(item)'''
联系客服