周海汉 /文
2010.4.11
http://blog.csdn.net/ablo_zhou

python 2.4以后,增加了@符号修饰函数对函数进行修饰,python3.0/2.6又增加了对类的修饰。
我现在使用的python版本,支持对class的修饰:
zhouhh@zhouhh-home:~$ python
Python 2.6.4 (r264:75706, Dec  7 2009, 18:45:15)
[GCC 4.4.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
@修饰符挺像是处理函数或类之前进行预处理。

语法示例:

@dec1
@dec2
def test(arg):
    pass

其效果类似于
dec1(dec2(test(arg)))
修饰函数还可以带参数。
@dec1(arg1,arg2)
def test(testarg)
效果类似于
dec1(arg1,arg2)(test(arg))

用法示例

示例1 参数类型和返回值类型检查

对于python这样的动态语言,不像C++这样的一开始就有严格静态的类型定义。但是,在某些情况下,就需要这样的类型检查,那么可以采用@修饰的方式。下面的示例就是检查输入参数类型和返回值类型的例子。

#!/usr/bin/env python
#coding:utf8
def  accepts (* types) :
    def  check_accepts ( f) :
        assert  len ( types)  ==  f. func_code. co_argcount
        def  new_f (* args,  ** kwds) :
            for  ( a,  t)  in  zip ( args,  types) :
                assert  isinstance ( a,  t),  /
                       "arg %r does not match %s " % ( a, t)
            return  f(* args,  ** kwds)
        new_f. func_name =  f. func_name
        return  new_f
    return  check_accepts

def  returns ( rtype) :
    def  check_returns ( f) :
        def  new_f (* args,  ** kwds) :
            result =  f(* args,  ** kwds)
            assert  isinstance ( result,  rtype),  /
                   "return value %r does not match %s " % ( result, rtype)
            return  result
        new_f. func_name =  f. func_name
        return  new_f
    return  check_returns

@ accepts ( int ,  ( int , float ))
@ returns (( int , float ))
def  func ( arg1,  arg2) :
    return  arg1 *  arg2

if  __name__ ==  '__main__ ':
    a =  func( 3 , 'asdf ')

zhouhh@zhouhh-home:~$ ./checktype.py
Traceback (most recent call last):
  File "./checktype.py", line 27, in <module>
    @returns((int,float))
  File "./checktype.py", line 5, in check_accepts
    assert len(types) == f.func_code.co_argcount
AssertionError

其实,xml-rpc中,对于函数参数,返回值等都需要采用xml的方式传递到远程再调用,那么如何检查类型呢?就可以用到如上的@修饰符。

python 中的@符号相关推荐

  1. python中的@符号的作用

    python中的@符号的作用_weixin_34014555的博客-CSDN博客 Python中的" @"(@)符号有什么作用?_p15097962069的博客-CSDN博客

  2. python中哪个符号用于从包中导入模块__学小易找答案

    [简答题]7个积分题 [单选题]5. Is it time for the meeting now? [单选题]result = lambda x: x * x print(result(5)) 以上 ...

  3. python中的符号下划线_详解Python中下划线的使用方法

    编程派微信号:codingpy 这篇文章讨论Python中下划线_的使用.跟Python中很多用法类似,下划线 _ 的不同用法绝大部分(不全是)都是一种惯例约定. 单个下划线(_) 主要有三种情况: ...

  4. python各种常用符号的意思_写一篇专门介绍python中各种符号的意义及用法

    挖槽,小米今天上市就破发了,好多认购的小伙伴有点慌了,其实对于小帅b来说这很正常,没必要慌,保持持有就好了,相信小米会越来越牛逼的.小米和可能会成为互联网新一代的霸主主一,到时候可能就不是BAT了,而 ...

  5. python中特殊符号怎么输入_python中怎么输入引号

    Python中的引号可分为单引号.双引号和三引号. 在Python中我们都知道单引号和双引号都可以用来表示一个字符串,比如str1 = 'python' str2 = "python&quo ...

  6. python中求和符号怎么打_SymPy求和表达式中的代换符号

    我想替换求和中的符号并打印出计算的表达式,但当我尝试这样做时,会遇到错误.在 正确的方法是什么?这可能吗?在 我用这种方式创建了一个求和表达式:>>> from sympy impo ...

  7. python中四则运算符号_Python-四则运算-蔡晓晴,杜婷萱

    一.需求 1.使用-n 参数控制生成题目的个数 2.使用-r 参数控制题目中数值(自然数.真分数和真分数分母)的范围 3.生成的题目中计算过程不能产生负数 4. 生成的题目中如果存在形如e1 ÷ e2 ...

  8. Python中的符号

    解释经常在python源码中看到的@,->和:等符号.python在函数名或类名首字母用_来表示私有接口(仅供内部使用). 标注 关联到某个变量.类属性.函数形参或返回值的标签,被约定作为类型提 ...

  9. python中运算符号怎样表示_Python中的运算符与表达式

    你所编写的大多数语句(逻辑行)都包含了表达式(Expressions).一个表达式的简单例子便是 2+3.表达式可以拆分成运算符(Operators)与操作数(Operands). 运算符(Opera ...

  10. python中求和符号怎么打_参数siz向量的python符号求和与微分

    您可以使用SymPy 1.0版中引入的新张量数组模块.在 我假设您的K和M参数是数字,而不是符号(否则我建议使用symphy.tensor.索引).在 考虑两个向量的长度.因此,X是秩2和形(2,3) ...

最新文章

  1. 数字化转型的研究方向
  2. 计算任何一天是星期几的几种算法
  3. 具有Spring的简单工作流引擎
  4. [vue] 说说组件的命名规范
  5. 第四十五期:程序员未来干什么?做架构还是做管理?
  6. [-1]是也乎,( ̄▽ ̄)
  7. python定时杀进程
  8. mysql mysql_real_connect 内存泄露
  9. SM系列国密算法(转)
  10. Linux安装,虚拟机VMware-workstation安装CentOS操作系统的安装手册
  11. 【GDB调试学习笔记】利用core文件调试程序
  12. 从Bus Hound开始学USB之U盘
  13. 安装element ui
  14. 渗透测试(445端口)
  15. 车辆碰撞起火事故的规律特点及常见起火原因 | 事故分析
  16. 阳明心学在敏捷开发中的应用
  17. 前端性能优化实践:让视频加载也“懒”一点
  18. Unity3D游戏开发从零单排(五) - 导入CS模型到Unity3D
  19. 什么是顶尖的互联网产品经理?
  20. android 电源管理

热门文章

  1. 【基于python实现UI自动化】3.4 JS 处理日历控件(删除 readonly 属性)
  2. selenium修改readonly属性的方法
  3. 协同过滤算法_协同过滤在新闻推荐CTR预估中的应用
  4. 中国体外冲击波碎石机行业市场供需与战略研究报告
  5. 已解决:缓存穿透、缓存击穿和缓存雪崩,你都懂了吗?
  6. OpenGL3.3鼠标拾取物体
  7. macbook搭建java环境_MacBook从零开始搭建java环境
  8. 治疗颈椎病的方法,运动自我疗法
  9. 宽带停了竟然还能上网?!
  10. dotnetCore跨域的解决