我正在学习Python,我编写了这段代码来探索装饰器的机制。
假设我有一个对象列表和一个我想用来装饰其中一个方法的函数,但我不希望装饰是永久性的。
这是实现这一结果的一种方法:
class Human:
def __init__(self, name):
self.name = name
class Man(Human):
def hello(self):
print("Hello, my name is " + self.name)
def __call__(self):
self.hello()
class Woman(Human):
def hello(self):
print("Hello, my name is " + self.name)
def __call__(self):
self.hello()
def deco(func):
def wrap():
print("-*-*-*-*-*-*-*-*-*-*-*-*-")
func()
print("*-*-*-*-*-*-*-*-*-*-*-*-*")
return wrap
H = Man("Harry")
S = Woman("Sally")
print("\n")
H.hello()
S.hello()
print("\n\nDecoration:\n")
people = [H, S]
for f in list(map(deco, people)):
f()
print("\n")
这是输出:
Hello, my name is Harry
Hello, my name is Sally
Decoration:
-*-*-*-*-*-*-*-*-*-*-*-*-
Hello, my name is Harry
*-*-*-*-*-*-*-*-*-*-*-*-*
-*-*-*-*-*-*-*-*-*-*-*-*-
Hello, my name is Sally
*-*-*-*-*-*-*-*-*-*-*-*-*
这是所需的输出。
获得它的另一种方法可能是删除类中的调用定义并使用它:
functions = [H.hello, S.hello]
for f in list(map(deco, functions)):
f()
我更喜欢,因为我明确地将我想要装饰的函数传递给deco()装饰器。
我不满意,因为我正在寻找像这样的东西
people = [H, S]
for i in range(len(people)):
decoratedHello = deco(people[i].hello)
decoratedHello()
但是这个看起来更像是一种C ++思维方式,而我正在寻找一种以更加Python风格的方式实现这一目标的方法。有谁知道怎么做?
由于
答案 0 :(得分:0)
你可能想要这样的东西
for f in (deco(p.hello) for p in people):
f()
或者这个
for p in people:
decorated = dec(p.hello)
decorated()
但是恕我直言,最强烈的
for f in map(deco, people):
f()