今天学习廖老师的python教程,碰到了修饰符'@',不太了解,查看了下官方文档

简单的整理下:

  1. @dec2
  2. @dec1
  3. def func(arg1, arg2, ...):
  4. pass

 等价于

  1. def func(arg1, arg2, ...):
  2. pass
  3. func = dec2(dec1(func))

使用示例:

comp.lang.python 和 python-dev的大部分讨论集中在更简捷地使用内置修饰符staticmethod() 和 classmethod() 上。但修饰符的功能远比这强大。下面会对它的使用进行一些讲解:

1.定义一个执行即退出的函数。注意,这个函数并不像通常情况那样,被真正包裹。

  1. def onexit(f):
  2. import atexit
  3. atexit.register(f)
  4. return f
  5.  
  6. @onexit
  7. def func():
  8. ...

(Note that this example is probably not suitable for real usage, but is for example purposes only.)

注意,这个示例可能并不能准确表达在实际中的使用,它只是做一个示例。

2.定义一个只能产生一个实例的类(有实例后,这个类不能再产生新的实例)。注意,一旦这个类失效了(估计意思是保存在下文的singleton中字典中的相应键失效),就会促使程序员让这个类产生更多的实例。(来自于python-dev的Shane Hathaway)

  1. def singleton(cls):
  2. instances = {}
  3. def getinstance():
  4. if cls not in instances:
  5. instances[cls] = cls()
  6. return instances[cls]
  7. return getinstance
  8.  
  9. @singleton
  10. class MyClass:
  11. ...

3.Add attributes to a function. (Based on an example posted by Anders Munch on python-dev.)

  1. def attrs(**kwds):
  2. def decorate(f):
  3. for k in kwds:
  4. setattr(f, k, kwds[k])
  5. return f
  6. return decorate
  7.  
  8. @attrs(versionadded="2.2",
  9. author="Guido van Rossum")
  10. def mymethod(f):
  11. ...

4.Enforce function argument and return types. Note that this copies the func_name attribute from the old to the new function. func_name was made writable in Python 2.4a3:

  1. def accepts(*types):
  2. def check_accepts(f):
  3. assert len(types) == f.func_code.co_argcount
  4. def new_f(*args, **kwds):
  5. for (a, t) in zip(args, types):
  6. assert isinstance(a, t), \
  7. "arg %r does not match %s" % (a,t)
  8. return f(*args, **kwds)
  9. new_f.func_name = f.func_name
  10. return new_f
  11. return check_accepts
  12.  
  13. def returns(rtype):
  14. def check_returns(f):
  15. def new_f(*args, **kwds):
  16. result = f(*args, **kwds)
  17. assert isinstance(result, rtype), \
  18. "return value %r does not match %s" % (result,rtype)
  19. return result
  20. new_f.func_name = f.func_name
  21. return new_f
  22. return check_returns
  23.  
  24. @accepts(int, (int,float))
  25. @returns((int,float))
  26. def func(arg1, arg2):
  27. return arg1 * arg2

5.Declare that a class implements a particular (set of) interface(s). This is from a posting by Bob Ippolito on python-dev based on experience with PyProtocols [27].

  1. def provides(*interfaces):
  2. """
  3. An actual, working, implementation of provides for
  4. the current implementation of PyProtocols. Not
  5. particularly important for the PEP text.
  6. """
  7. def provides(typ):
  8. declareImplementation(typ, instancesProvide=interfaces)
  9. return typ
  10. return provides
  11.  
  12. class IBar(Interface):
  13. """Declare something about IBar here"""
  14.  
  15. @provides(IBar)
  16. class Foo(object):
  17. """Implement something here..."""

  

 

python中的 @ 修饰符的更多相关文章

  1. Python 中的@修饰符作用

    在Python 2.4以上的的函数中偶尔会看到函数定义的上一行有@functionName的修饰,这一下这个语法细节,其实这有点像C语言带参数的宏操作,解释器读到这样的修饰之后,会先解析@后的内容,直 ...

  2. python中的修饰符@的作用

    1.一层修饰符 1)简单版,编译即实现 在一个函数上面添加修饰符 @另一个函数名 的作用是将这个修饰符下面的函数作为该修饰符函数的参数传入,作用可以有比如你想要在函数前面添加记录时间的代码,这样每个函 ...

  3. JAVA语言中的修饰符

    JAVA语言中的修饰符 -----------------------------------------------01--------------------------------------- ...

  4. Java中的 修饰符

    java中的修饰符分为类修饰符,字段修饰符,方法修饰符. 根据功能的不同,主要分为以下几种. 1.权限访问修饰符  访问权限的控制常被称为具体实现的隐藏 把数据和方法包进类中,以及具体实现的隐藏,常共 ...

  5. C/C++ 中 const 修饰符用法总结

    C/C++ 中 const 修饰符用法总结 在这篇文章中,我总结了一些C/C++语言中的 const 修饰符的常见用法,供大家参考. const 的用法,也是技术性面试中常见的基础问题,希望能够帮大家 ...

  6. Java中final修饰符深入研究

    一.开篇 本博客来自:http://www.cnblogs.com/yuananyun/ final修饰符是Java中比较简单常用的修饰符,同时也是一个被"误解"较多的修饰符.对很 ...

  7. vue中的修饰符

    Vue2.0学习笔记:Vue事件修饰符的使用   事件处理 如果需要在内联语句处理器中访问原生DOM事件.可以使用特殊变量$event,把它传入到methods中的方法中. 在Vue中,事件修饰符处理 ...

  8. Java中各种修饰符与访问修饰符

    Java中各种修饰符与访问修饰符 类: 访问修饰符 修饰符 class 类名称 extends 父类名称 implement 接口名称 (访问修饰符与修饰符的位置可以互换) 访问修饰符 名称 说明 备 ...

  9. Java中访问修饰符public、private、protecte、default

    Java中访问修饰符public.private.protecte.default的意义讲解:public: Java语言中访问限制最宽的修饰符,一般称之为“公共的”.被其修饰的类.属性以及方法不 仅 ...

随机推荐

  1. 2014ACM/ICPC亚洲区北京站 上交命题

    A http://acm.hdu.edu.cn/showproblem.php?pid=5112 输入n个时刻和位置,问那两个时刻间速度最快. 解法:按照时间排序,然后依次求相邻两个之间的速度,速度= ...

  2. SQL Server优化

    虽然查询速度慢的原因很多,但是如果通过一定的优化,也可以使查询问题得到一定程度的解决. 查询速度慢的原因很多,常见如下几种: 没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) I/ ...

  3. ios kvo

    kvo的使用方法: 1.注册: -(void)addObserver:(NSObject *)anObserver forKeyPath:(NSString *)keyPath options:(NS ...

  4. HTML页面处理以及资源文件的加载

    Javascript 异步加载详解 这篇文章很详细的介绍了HTML的页面处理以及资源文件的加载. 本文总结一下浏览器在 javascript 的加载方式. 关键词:异步加载(async loading ...

  5. javascript实现数据结构:串--定长顺序存储表示以及kmp算法实现

    串(string)(或字符串)是由零个或多个字符组成的有限序列.串中字符的数目称为串的长度.零个字符的串称为空串(null string),它的长度为零. 串中任意个连续的字符组成的子序列称为该串的子 ...

  6. SELINUX设为Disable 影响java SSH工具包Jsch 0.1.49.jar的一个案例

    最近项目中遇到一个典型事件,当RHEL 的SELINUX设为DISABLE时 使用JAVA的Jsch 库调用SSH命令时将随机返回空字符串,我使用的版本是0.1.49,最新版本0.1.51未测试. 关 ...

  7. 怎样强制QQ聊天

    首先复制下面这段网址: http://wp.qq.com/open_webaio.html?sigt=2d3bb7d31517da8c94a1061c6b63dd3203eb633805dcd09ec ...

  8. Jmeter以non-gui模式进行分布式测试

    http://www.51testing.com/html/61/n-2422461.html

  9. Java:静态导入

    静态导入 importStatic 当类重名时,需要指定具体的包名. 当方法重名时,需要指定具体的类或对象名. 举例如下: import java.util.*; import static java ...

  10. iOS:实现MKAnnotation协议,在地图上设置大头针,点击显示具体的位置信息

    如何添加大头针(地标): 通过MapView的addAnnotation方法可以添加一个大头针到地图上 通过MapView的addAnnotations方法可以添加多个大头针到地图上 –(void)a ...