Python中的“ @”(@)符号有啥作用?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python中的“ @”(@)符号有啥作用?相关的知识,希望对你有一定的参考价值。

【@】符号在python中是装饰器的意思。
装饰器对一个可调用对象(函数、方法、类等等)进行装饰,它返回的也是一个可调用对象。
一般情况下,装饰器是对被装饰对象的修饰与增强。用现实事物类比的话,可以类比为中间商:中间商不生产产品,它将工厂生产的产品进行包装、运输后再销售给顾客。装饰器不实现核心功能,它提供对目标函数调用的封装与强。
它装饰的方法返回值是一个对象(BillList、Bill、List[BillDetail]等),而装饰器【enabled_cache】的作用如它的名称一样:使用缓存。可以看到,这个装饰器函数中定义了一个函数【wrapper】然后将这个wrapper作为返回值。这样,原本调用ProductionBos.bill_with_last_week的代码就不需要做任何改变就能享受到ProductionBos.bill_with_last_week原有的功能(得到一个BillList对象)和enabled_cache提供的附加功能(如果该对象有缓存,就不再从数据库查询)。
参考技术A 据了解@符号的作用一般是:'@'符号用作函数修饰符是python2.4新增加的功能,修饰符必须出现在函数定义前一行,不允许和函数定义在同一行。也就是说@A
def f(): 是非法的。
只可以在模块或类定义层内对函数进行修饰,不允许修修饰一个类。一个修饰符就是一个函数,它将被修饰的函数做为参数,并返回修饰后的同名函数或其它可调用的东西。望采纳
参考技术B 符号在python中是装饰器的意思。 装饰器对一个可调用对象(函数、方法、类等等)进行装饰,它返回的也是一个可调用对象。
一般情况下,装饰器是对被装饰对象的修饰与增强。用现实事物类比的话,可以类比为中间商:中间商不生产产品,它将工厂生产的产品进行包装、运输后再销售给顾客。装饰器不...
参考技术C 在Python 3.5中,您可以将@重载为运算符。 它被命名为__matmul__,因为它旨在进行矩阵乘法,但是它可以是您想要的任何东西。 有关详细信息,请参见PEP465。
这是矩阵乘法的简单实现。
class Mat(list): def __matmul__(self, B): A = self return Mat([[sum(A[i][k]*B[k][j] for k in range(len(B))) for j in range(len(B[0])) ] for i in range(len(A))])A = Mat([[1,3],[7,5]])B = Mat([[6,8],[4,2]])print(A @ B)

此代码产生:
[[18, 14], [62, 66]]

JavaScript 多行注释中的“@”符号有啥作用?

【中文标题】JavaScript 多行注释中的“@”符号有啥作用?【英文标题】:What does the '@' symbol do in JavaScript multiline comments?JavaScript 多行注释中的“@”符号有什么作用? 【发布时间】:2019-10-16 01:16:47 【问题描述】:

在我浏览了 Muuri 源代码并到处看到这个之后,我真的很好奇:

var htmlCollectionType = '[object HTMLCollection]';
var nodeListType = '[object NodeList]';

/**
 * Check if a value is a node list
 *
 * @param * val
 * @returns Boolean
 */
export default function isNodeList(val) 
  var type = Object.prototype.toString.call(val);
  return type === htmlCollectionType || type === nodeListType;

@param 和 @returns 似乎实际上并没有做任何事情(我认为),但它们的突出显示方式不同。事实上,如果你查看 git 中的代码,它们会突出显示 as though they're not comments。

这是我不知道的一些 JavaScript 语法吗?这里发生了什么?我很想知道。

【问题讨论】:

它们是 cmets,提供函数isNodeList 接受的参数和返回值的描述。您的函数返回 boolean value 并接受 * 指示的所有 DT 的参数。 【参考方案1】:

这只是使用JSDoc comments。语法受 Java 的影响,Java 将 JavaDoc cmets 作为标准的一部分。简而言之,注释记录了一个函数或方法的作用,它有一些特殊的语法——它是一个以/** 开头的块注释,而不是仅仅/*,以将它与普通块注释区分开来,你可以使用一些表示不同含义的注释:

@param 表示这是一个参数。 中的值表示参数的类型 - 在本例中,* 表示“任何”,但您可以记录类似 @param string@param number 的内容 val 是函数使用的参数的名称。 您可以选择为参数添加描述,例如 @param * val - used for foo and bar @return 记录了函数的返回。 中的值又是类型。在这种情况下,一个布尔值。 您仍然可以选择为返回值添加注释,例如:@returns Boolean true if correct, false if incorrect

您可以使用 JSDoc 语法记录更多内容,例如 @copyright 指定许可证或 @throws 声明某些代码可能抛出的预期异常。一些语法是特定于函数或方法的,另一些是特定于对象甚至整个文件的。

总而言之,这是一种将文件中的描述标准化的尝试。您不需要需要对评论做任何事情,但您也可以使用读取 cmets 并对其采取行动的工具 - 有些像 Tern.js 将读取 cmets 并尝试检查您的代码是否符合,例如,如果你有

/**
 * @param number bar
 * @return boolean
 */
function foo(bar) 

如果您致电foo("abc"),那么您可能会收到工具警告您应该传递一个数字。或者,如果您使用foo(123).replace("a", "b"),您可能会收到一条警告,提示您正在尝试对应该是布尔值的字符串方法。

其他工具可能只是抓取您的 JS 文件并生成文档。 Java 使用 JavaDoc 做到这一点 - 您可以基于 JavaDoc cmets 自动为您的方法和类生成文档。你会得到一个文档in the official Java style,这意味着任何文档都是一致的。

【讨论】:

以上是关于Python中的“ @”(@)符号有啥作用?的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 多行注释中的“@”符号有啥作用?

ES6 javascript 中的 at 符号 (@) 有啥作用? (ECMAScript 2015)

格式字符串中的多个前导“#”符号有啥作用吗?

美元符号 $ 在 url 中有啥作用?

excel 数据-分列 中分割符号中的 tab键默认情况下是选中,我想问一下tab键有啥作用?

word中 回车的表示方法是^p 请问^p中的^是啥意思,有啥具体作用