1. 程式人生 > >python中的 @ 修飾符

python中的 @ 修飾符

今天看到python中的一個修飾符'@',不瞭解它的使用,查看了下官方文件,有了一點了解。

不得不佩服老外,治學很嚴謹,在python網站相關網頁上把為什麼使用decorator(主要為了簡便一些程式碼),以及使用什麼字元,甚至語法怎麼設計寫了個詳詳細細,好長的一篇啊。

這是檢視的其中一篇,我翻譯關鍵部分的一些內容,又摘取一些有用的,有空再翻譯。

@dec2
@dec1
def func(arg1, arg2, ...):
    pass

This is equivalent to(等價於):
def func(arg1, arg2, ...):
    pass
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.定義一個執行即退出的函式。注意,這個函式並不像通常情況那樣,被真正包裹。
def onexit(f):
    import atexit
    atexit.register(f)
    return f

@onexit
def func():
    ...

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
def singleton(cls):
    instances = {}
    def getinstance():
        if cls not in instances:
            instances[cls] = cls()
        return instances[cls]
    return getinstance

@singleton
class MyClass:
    ...

餘下基本可以參照著讀懂了,以後再翻譯。 3.Add attributes to a function. (Based on an example posted by Anders Munch on python-dev.)
def attrs(**kwds):
    def decorate(f):
        for k in kwds:
            setattr(f, k, kwds[k])
        return f
    return decorate

@attrs(versionadded="2.2",
       author="Guido van Rossum")
def mymethod(f):
    ...

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:
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

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].
def provides(*interfaces):
     """
     An actual, working, implementation of provides for
     the current implementation of PyProtocols.  Not
     particularly important for the PEP text.
     """
     def provides(typ):
         declareImplementation(typ, instancesProvide=interfaces)
         return typ
     return provides

class IBar(Interface):
     """Declare something about IBar here"""

@provides(IBar)
class Foo(object):
        """Implement something here..."""
Of course, all these examples are possible today, though without syntactic support.



相關推薦

python文字串編碼問題

err har .json 情況 comm 常用 class not 字符串類型 接口測試的時候,發現接口返回內容是uncodie類型但是包含中文。在使用print進行打印時輸出提示錯誤: UnicodeEncodeError: ‘ascii‘ codec can‘t e

python串(str)的常用處理方法

num replace 不同的 swa pos track con strong 位置 str=‘Python String function‘ 生成字符串變量str=‘python String function‘字符串長度獲取:len(str)例:print ‘%

Python運算與while初識

strong spa .cn wid 比較 logs 語法 案例 一個 一、運算符   1、算術運算:   2、比較運算:   3、賦值運算:   4、位運算: 註: ~ 舉例: ~5 = -6 解釋: 將二進制數+1之後乘以-1,即~x = -(x+1),-

Python串的表示

friend target follow pst tar spf aid hms lan 區別於其他語言,python中字符串可以用3中方法表示,且都能被正確編譯: 1、‘mary‘ 單引號括起來 2、"it‘s a great day" 雙引號括起來 3、‘‘‘   ni

python一些函數的用法

strip() strip 左右 art orm 是不是 必須 執行 count() 1..capitalize():字符串的首字母大寫; 2..count():字符串中的某個字母的個數; 3..center(50,‘-‘):對象居中,且左右用‘-’補齊; 4..enco

python串的內置方法

修改 rst form part 異常 attr_ 是否 sta 賦值 這裏說的是字符串中的內置方法,畢竟字符串是最常用的操作對象。 [‘__add__‘, ‘__class__‘, ‘__contains__‘, ‘__delattr__‘, ‘__doc__‘, ‘__

python 字典 列表之間的轉換

png 列表 如果 asdasd 技術分享 com asd bsp 例如 1 字典 轉 字符 定義一個字典:dict = {‘name‘: ‘python‘, ‘age‘: 7}字典轉字符 可以使用str強制轉換 如: str(dict) 此時dict的類型就是字符型了

Python串、列表、元組、字典

python、運維1.字符串字符串四種定義方式:' ' " " ''' ''' """ """字符串的下標和切片:如: name = abcd

Python串表示str與repr

error: int recent rep 數字 整型 機器 理解 *** 所有通過Python打印的字符串還是被引號括起來的。這是因為Python打印值的時候會保持該值在Python代碼中的狀態,而不是你希望用戶看到的狀態,如果使用print 語句,結果就不一樣了。>

python串和列表只是匯總

.so join方法 gpo copy col 返回值 介紹 運算 AC 字符串知識匯總 字符串是描述變量的重要信息,其中的應用也是很多,很重要的一點就是StringBuilder。今天我們會為大家介紹一下常用的StringBuilder 1 strip lstrip rs

java修飾作用範圍

adding padding ble pad order 級別 pac borde cin 訪問級別 訪問控制修飾符 同類 同包 子類 不同包 公開 public √ √ √ √ 受保護 protected √ √ √ × 默認 defult(沒有修飾

python 含變量方法

hid 運行 nth clas format abc gif ima pen 1. 簡單粗魯的字符串拼接 1 name = "abc" 2 age = 25 3 info = "the name is "+name +"\nthe age is " + str(age)

Python串的常用方法

lap 分享圖片 大於 sdi errors enc lin dig 區分 按索引取值 字符串是不可變類型,並不能改變字符串的值 最多可以有三個參數,分別是起始位置,結束為止和步長,可以正向取值,反響取值(起始位置大於結束位置或者沒有起始位置與結束位置,步長為-1表示

關於python串的操作方法

反轉 補充 per 14. 防止 cas 愛好 是否 apc 1.capitalize() 首字母大寫 1 s = ‘helloPython‘ 2 s1 = s.capitalize() #首字母大寫 3 print(s1) #輸出結果:Hellopyt

Python運算not、and、or

true 運算符 nbsp pytho false 情況下 color tro 布爾 優先級1. and 與 2. or 或 3. not 非運算要記住:數字中非零為真零為假;True 為真 False 為假。or :與and相反,任意一個真即為真,同假才為假(因為要挨個查

Python的練習

句子 rand pan 打印 次數 enc sans pda 所有 一、重復的單詞:此處認為分隔符為空格;1.用戶輸入一句英文句子;2.打印出每個單詞,以及每個單詞出現的次數輸入:hello java hello python一、解析:Sentenct = raw_inp

python串的操作方法

數量 ror tle 列表 格式 dig 集合 都是 2018年 python中字符串的操作方法大全 更新時間:2018年06月03日 10:08:51 作者:駿馬金龍 我要評論這篇文章主要給大家介紹了關於python中字符串操作方法的相關資料,文中通過示例代碼詳細介紹了

請簡要敘述下Java修飾的作用域及可見性?

public:修飾的成員可以在任何範圍內直接訪問,只是一種最寬鬆的訪問控制等級。需要注意的,所謂的直接訪問仍需要先建立或獲得一個相應類的物件然後才可以使用”物件名.成員“的方式訪問其屬性或呼叫其方法,但是出於資訊封裝和隱藏的需要一般不提倡把成員宣告為public的,而構造方法和需要外界直

python-函式修飾@說明

#!/usr/bin/env python # -*- coding:utf-8 -*— def a(f): print "i am a" f() @a def b(): print "i am b" debug結果: i am a i am b 其中:

Python 函式修飾(裝飾器)的使用

1.  修飾符的來源借用一個部落格上的一段敘述:修飾符是一個很著名的設計模式,經常被用於有切面需求的場景,較為經典的有插入日誌、效能測試、事務處理等。修飾符是解決這類問題的絕佳設計,有了修飾符,我們就可以抽離出大量函式中與函式功能本身無關的雷同程式碼並繼續重用。概括的講,修飾