Python:装饰对象列表

时间:2017-07-26 18:20:02

标签: python-3.x

我正在学习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风格的方式实现这一目标的方法。有谁知道怎么做?

由于

1 个答案:

答案 0 :(得分:0)

你可能想要这样的东西

for f in (deco(p.hello) for p in people):
    f()

或者这个

for p in people:
    decorated = dec(p.hello)
    decorated()

但是恕我直言,最强烈的是:#like your first try ...

for f in map(deco, people):
    f()