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中的“ @”(@)符号有啥作用?的主要内容,如果未能解决你的问题,请参考以下文章
ES6 javascript 中的 at 符号 (@) 有啥作用? (ECMAScript 2015)