蝉鸣后又雪 2019-03-30 01:36 采纳率: 0%
浏览 696

请指教这个python 装饰器的实现原理是什么?我懵了,函数定义没写参数,竟然可以传参我有点害怕python了。

请看下面这个装饰器和普通函数,参数传递是怎么进行的或者保存在哪里吗?
希望前辈能解释一下,我没理解。

def new_func(func):
    def wrapped(username, passwd):
        if username == 'root' and passwd == '123456789':
            print('通过认证!')
            print('开始执行附加功能')
            return func()
        else:
            print('用户名或密码错误')
            return
    return wrapped

@new_func
def orign():
    print('开始执行函数')

if __name__ == '__main__':
    orign('root', '123456789')
#输出:
#通过认证!
#开始执行附加功能
#开始执行函数
  • 写回答

2条回答 默认 最新

  • threenewbee 2019-03-30 08:54
    关注
    这很正常。装饰器和被装饰的函数又不是一回事,为啥要参数一样。
    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());

    评论

报告相同问题?

悬赏问题

  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)
  • ¥20 matlab yalmip kkt 双层优化问题
  • ¥15 如何在3D高斯飞溅的渲染的场景中获得一个可控的旋转物体
  • ¥88 实在没有想法,需要个思路
  • ¥15 MATLAB报错输入参数太多
  • ¥15 python中合并修改日期相同的CSV文件并按照修改日期的名字命名文件
  • ¥15 有赏,i卡绘世画不出