为什么会先打印war2再打印war1,代码由上往下执行的话,war1不是先装饰的f函数吗
时间: 2023-06-23 10:09:36 浏览: 23
在代码中,`war2`是先被装饰器`decorator1`装饰的,而`war1`是先被装饰器`decorator2`装饰的,因此在执行时,先执行的是`war2`,输出了`war2`函数被装饰了。然后,执行到`war1`函数时,由于它被装饰器`decorator2`装饰,所以会先执行`decorator2`函数中的代码,输出了`war1`函数被装饰了。最后,执行`war1`函数本身的代码,输出了`war1`函数被调用了。所以,先打印的是`war2`,后打印的是`war1`。
相关问题
要使用war_red里warrior的成员函数的代码该怎么写
如果要使用 `war_red` 向量中 `warrior` 类型的成员函数,需要使用指针或引用来访问向量中的对象。以下是一个使用指针的示例:
```cpp
// 遍历 war_red 向量,调用每个 warrior 对象的 attack() 成员函数
for (auto it = war_red.begin(); it != war_red.end(); ++it) {
(*it)->attack();
}
```
在这个示例中,使用迭代器访问向量中的对象,并使用指针运算符 `->` 访问 `warrior` 类型的成员函数 `attack()`。
如果要使用引用的话,可以像这样:
```cpp
// 遍历 war_red 向量,调用每个 warrior 对象的 show() 成员函数
for (auto& w : war_red) {
w.show();
}
```
在这个示例中,使用了 `auto&` 引用类型,将向量中的每个 `warrior` 对象传递给了循环变量 `w`。然后,可以像访问普通对象一样,使用点号 `.` 访问 `warrior` 类型的成员函数 `show()`。
无论是使用指针还是引用,都需要注意访问向量中的对象时,是否需要使用动态绑定来调用派生类的成员函数。
def war1(func): print("war1") def inner(*args, **kwargs): print("======war1 start=====") func(*args, **kwargs) # inner print("======war1 end=====") return inner def war2(func): print("war2") def inner(*args, **kwargs): print("======war2 start=====") func(*args, **kwargs) print("======war2 end=====") return inner @war1 @war2 def f(): print("****self****")
这是一个装饰器示例代码,用于给函数 f 添加两个装饰器 war1 和 war2。在 Python 中,装饰器是将函数作为参数并返回新函数的函数。通过添加装饰器,可以动态地修改函数的行为。
在这个例子中,war1 和 war2 都定义了一个内部函数 inner,inner 会先打印一些信息,然后再调用被装饰的函数 func,最后再打印一些信息。装饰器的执行顺序是从下往上执行的,所以先执行 war2,再执行 war1。当调用函数 f() 时,实际上是调用了 inner 函数,因此会先打印 "======war1 start=====",然后打印 "======war2 start=====",接着打印 "****self****",再依次打印 "======war2 end=====" 和 "======war1 end====="。