了解一流的功能

时间:2019-10-19 21:52:17

标签: python decorator wrapper

我试图了解一流的功能以及如何在实际示例中使用它们。我想到的示例是在为登录用户调用特定功能之前进行身份验证的。例如:

('A', 'B', 'C')
('A', 'C', 'B')
('B', 'A', 'C')
('B', 'C', 'A')
('C', 'A', 'B')
('C', 'B', 'A')

哪些印刷品:

  

1个已登录! ==>调用函数“ xyz”

这是对一流功能的正确理解吗?以上似乎更像是def authenticate(user_id): if user_id != 1: return None def call_func(func_name): print(f"{user_id} is logged in! ==> Calling function '{func_name}'") return call_func user0 = authenticate(user_id=0) if user0: user0(func_name='xyz') user1 = authenticate(user_id=1) if user1: user1(func_name='xyz') wrapper的概念。这些基本上是同一回事,还是这三个概念之间有什么区别?

1 个答案:

答案 0 :(得分:2)

第一类只是意味着它可以独立存在。不需要无人陪伴。

方法

在Java和C#等语言中,您可以创建将方法推入的类。

class Logger {
    public Logger(string name) {
        this.name = name;
    }

    public void Log(string msg) {
        System.out.print(name + msg);
    }
}

然后使用这些类的实例来调用方法。

Logger logger = new Logger("a name");
logger.Log("a message");

函数只能作为类的方法存在。班级是头等舱公民。

功能

在像python这样的语言中,您只能有一个函数。

def log(name, msg):
    print(name, msg)

然后调用该函数。

log('a name', 'a message')

一个函数可以简单地存在。

关于Python的注释

Python的类很好。因此,如果您仍然不想一直输入'a name',可以使用它们。

class Logger:
    def __init__(self, name):
        self.name = name

    def log(self, msg):
        print(self.name, msg)

logger = Logger('a name')
logger.log('a message')

而且由于函数是头等公民,所以闭包也是一回事,只需函数即可实现闭包。

def logger(name):
    def log(msg):
        print(name, msg)
    return log

log = logger('a name')
log('a message')

装饰器

装饰器只是使用其他功能的简单功能。例如,以先前的log功能为例。如果我们有一个fuzz装饰器,并用它装饰log函数,则它实际上将用自己的log函数(恰好称为我们的log函数)代替。

def fuzz(func):
    def fuzzed_func(*args, **kwargs):
        print('fuzz')
        func(*args, **kwargs)
        print('fuzz')
    return fuzzed_func

@fuzz
def log(name, msg):
    print(name, msg)
  

绒毛

     

给消息命名

     

绒毛


注1.在此处给出的所有示例中,数据类型也都是一等公民。 string本身就是Java语言。在Python中,'a name'本身就是str。因此,不仅函数和类适用于第一类。

注释2。还请考虑在类的情况下,可以有对selfthis不起作用的方法,它们被称为静态方法。本质上是类中的函数。

其他

关于这一点,有个奇妙的讽刺,您可能想在某个时候阅读。

Execution in the Kingdom of Nouns by Steve Yegge

最近在PyCon 2019上的大卫·比兹利(David Beazley)在这个主题上发表了精彩的演讲,松散地展示了函数的力量。

Lambda Calculus from the Ground Up