`

【转】 python中的 @ 修饰符

 
阅读更多

原文地址:http://blog.csdn.net/lainegates/article/details/8166764

 

今天看到python中的一个修饰符'@',不了解它的使用,查看了下官方文档,有了一点了解。

原文 PEP-318 网址:http://www.python.org/dev/peps/pep-0318/

不得不佩服老外,治学很严谨,在python网站相关网页上把为什么使用decorator(主要为了简便一些代码),以及使用什么字符,甚至语法怎么设计写了个详详细细,好长的一篇啊。

这是查看的其中一篇,我翻译关键部分的一些内容,又摘取一些有用的,有空再翻译。

 

 

[python] view plaincopy
 
  1. @dec2  
  2. @dec1  
  3. def func(arg1, arg2, ...):  
  4.     pass  


This is equivalent to(等价于):

 

 

[python] view plaincopy
 
  1. def func(arg1, arg2, ...):  
  2.     pass  
  3. func = dec2(dec1(func))  


使用示例:

 

Much of the discussion on comp.lang.python and the python-dev mailing list focuses on the use of decorators as a cleaner way to use the staticmethod() and classmethod() builtins. This capability is much more powerful than that. This section presents some examples of use.

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

 

1.Define a function to be executed at exit. Note that the function isn't actually "wrapped" in the usual sense.

1.定义一个执行即退出的函数。注意,这个函数并不像通常情况那样,被真正包裹。
[python] view plaincopy
 
  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. Define a class with a singleton instance. Note that once the class disappears enterprising programmers would have to be more creative to create more instances. (From Shane Hathaway onpython-dev.)

2.定义一个只能产生一个实例的类(有实例后,这个类不能再产生新的实例)。注意,一旦这个类失效了(估计意思是保存在下文的singleton中字典中的相应键失效),就会促使程序员让这个类产生更多的实例。(来自于python-dev的Shane Hathaway
[python] view plaincopy
 
  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.)
[python] view plaincopy
 
  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:
[python] view plaincopy
 
  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].
[python] view plaincopy
 
  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..."""  
Of course, all these examples are possible today, though without syntactic support.

df PSdf 

 

分享到:
评论

相关推荐

    python函数修饰符@的使用方法解析

    函数修饰符,又称装饰器(Decorator),是Python编程语言中的一个重要特性。装饰器本质上是一个函数,它允许你修改其他函数或方法的行为,而无需更改原有函数的代码。函数修饰符能够以非常简洁的方式来添加额外的...

    Python-pythongoto函式修饰符对bytecode进行重定向Python中的goto

    标题所提到的"Python-pythongoto函式修饰符"可能是指一种利用Python字节码来模拟goto功能的技术。Python的源代码首先会被编译成字节码,这是一种低级别的中间表示,然后再由Python解释器执行。通过直接操作这个字节...

    java2python--java代码转python工具

    Python没有公有、私有访问修饰符,所以转换时需考虑访问控制的相应调整。 2. 方法和函数:Java的方法在Python中被映射为函数,包括构造函数、抽象方法和重载方法。Python不支持重载,所以转换可能需要合并相似功能...

    05-python-修饰符的使用-operator模块-作用域-动态编译

    在Python编程语言中,了解和熟练使用修饰符、`operator`模块、作用域以及动态编译是提升代码效率和质量的关键。这篇学习笔记将深入探讨这些主题,帮助你更好地掌握Python编程的核心概念。 首先,我们来看看修饰符。...

    05-python-迭代器-生成器-with语句和上下文管理器-修饰符

    在Python编程语言中,迭代器、生成器、with语句和上下文管理器以及修饰符是四个非常重要的概念,它们在处理数据流和资源管理时起着关键作用。以下是关于这些知识点的详细解释: 1. **迭代器**: - 迭代器是一种...

    repeated限定修饰符的使用

    在protobuf中,`repeated`限定修饰符是一个非常重要的概念,用于表示一个字段可以有多个值,类似于数组或列表。本文将深入探讨`repeated`限定修饰符的使用及其相关知识点。 首先,我们需要理解protobuf的基本语法。...

    kaiwenli#python_book#10.5正则修饰符1

    正则修饰符示例:\w+$ 表示匹配以一个或者多个字母结尾re.M 可以进行多行匹配,每个换行都认为是一个结尾不实用re.M修饰符,只会匹配到最后的 man。

    python正则-re的用法详解

    今天是review,所以一些基础的概念就不做介绍了,先来看正则中的修饰符以及它的功能: 修饰符 •re.I 使匹配对大小写不敏感 •re.L 做本地化识别匹配 •re.M 多行匹配,影响^和$ •re.S 使.匹配包括换行在内的所有...

    疯狂Python讲义,疯狂python讲义pdf,Python

    - 封装:通过访问修饰符实现数据的保护。 3. 模块与包: - Python标准库:了解Python自带的模块,如os、sys、math等,以及如何导入和使用它们。 - 第三方模块:如numpy用于科学计算,pandas用于数据分析,...

    访问控制修饰符,以及枚举

    访问控制修饰符在面向对象编程语言中扮演着至关重要的角色,主要用于保护数据安全、实现封装原则。Java中提供了四种不同的访问控制级别: 1. **public**:表示公开的。这意味着,无论哪个类(包括其他包中的类)都...

    js代码-正则表达式的s修饰符使.能匹配\n或\r

    2. **历史背景**:在JavaScript之前,Perl和Python等语言已经支持`s`修饰符,使得`.`可以跨行匹配。JavaScript的这一更新是为了保持与其他语言的兼容性。 3. **应用场景**:这个修饰符在处理多行文本,尤其是从用户...

    python转java方法.docx

    3. **面向对象编程的差异**:Python 和 Java 都支持面向对象编程,但在 Python 中,类定义可以更简洁,没有 Java 中的 `public`、`private` 等访问修饰符。Java 中的继承、接口和抽象类也需要相应地转换。Python 中...

    python面向对象课件

    在Python中,可以通过访问修饰符来实现封装,如`public`(默认,无需修饰符)、`private`(前缀`_`)和`protected`(前缀`__`)。封装有助于保护数据,防止外部代码随意修改对象状态。 6. 多态: 多态允许不同类的...

    Python提高.zip

    在Python中,通常通过设置访问修饰符来实现封装,尽管Python没有像Java那样的严格访问控制,但我们可以使用下划线(_)来暗示不鼓励直接访问的属性或方法。例如,一个类可以有一个`__private`变量,表示这是内部使用...

    Python3.6中文手册(官方文档)

    - **访问控制**:通过public、private和protected修饰符控制成员的访问权限。 4. **高级特性**: - **装饰器**:允许在不修改原有函数代码的情况下,扩展其功能。 - **生成器**:通过yield关键字创建迭代器,...

    Python程序设计题库

    以上是对Python程序设计题库中涉及的知识点的详细解析,涵盖了Python的特点、字符串格式化、数据类型、参数传递、文件类型、方法类型、函数定义、递归以及匿名函数等核心概念。希望这些信息对学习和考试准备有所帮助...

    Python中文手册V2.4.rar

    封装则通过访问修饰符保护数据;多态允许不同类型的对象对同一消息作出响应。 Python还拥有丰富的内置函数,如len()用于获取序列长度,type()用于检查变量类型,print()用于输出信息。此外,还有异常处理机制,通过...

    python3程序开发指南中文

    - 封装与抽象:讲解如何通过访问修饰符实现数据封装,以及如何通过接口实现抽象。 3. **异常处理** - 异常和错误:了解Python中的异常结构,如何捕获和处理异常,以及常见的内置异常类型。 - 错误调试:学习如何...

    Python 3 Object-oriented Programming

    Python通过访问修饰符(如`public`、`private`)来实现封装,尽管Python没有严格的访问控制,但通常遵循一定的命名约定。 5. 抽象:抽象是将复杂系统分解为一系列独立的组件,每个组件代表系统的某个方面。在Python...

Global site tag (gtag.js) - Google Analytics