我试图了解一流的功能以及如何在实际示例中使用它们。我想到的示例是在为登录用户调用特定功能之前进行身份验证的。例如:
('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
的概念。这些基本上是同一回事,还是这三个概念之间有什么区别?
答案 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的类很好。因此,如果您仍然不想一直输入'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。还请考虑在类的情况下,可以有对self
或this
不起作用的方法,它们被称为静态方法。本质上是类中的函数。
关于这一点,有个奇妙的讽刺,您可能想在某个时候阅读。
Execution in the Kingdom of Nouns by Steve Yegge
最近在PyCon 2019上的大卫·比兹利(David Beazley)在这个主题上发表了精彩的演讲,松散地展示了函数的力量。