这很正常。装饰器和被装饰的函数又不是一回事,为啥要参数一样。
python只是在语法层面把装饰模式(设计模式的一种)封装了。这些代码,用Java一样可以实现。
Java的做法:
interface IAction
{
void orign();
}
class MyClass implements IAction
{
public void orign()
{
print("开始执行函数");
}
}
interface IAuthAction
{
void orign(String u, String p);
}
class Decorator implements IAuthAction
{
private IAction act;
public Decorator(IAction act)
{
this.act = act;
}
public void orign(String u, String p)
{
if (u.equals("root") && p.equals("123456789"))
{
print("通过认证!");
printf("开始执行附加功能");
act();
}
}
}
void main()
{
IAuthAction d = new Decorator(new MyClass());
d.orign("root", "123456789");
}
如果你对比下Java和Python的代码,你就会发现Python节约了什么
首先,在Python里,不需要Iaction和IAuthAction两个接口。这是因为Python是弱类型的。
在Java里,
Object o = new MyClass();
o.orign();
这样不可以,因为编译器不知道o的确切类型,就不能判断o是否有orign这个方法,也没办法生成调用的代码。所以必须将o声明为IAction才行。但是Python是运行时绑定的。
其次,Python内置装饰器,就不需要Decorator类了
Decorator的作用就是,将orign包装成具有两个参数的orign
在Python里,一个函数,如果能返回另一个函数(这两个函数显然参数并不要一样,好比这里的orign),那么就可以直接定义为包装器。
Python会执行包装后的函数,并且传入被包装的函数,相当于Java代码中的
IAuthAction d = new Decorator(new MyClass());