亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python中的descriptor描述器簡明使用指南

 更新時間:2016年06月02日 17:28:30   作者:人世間  
descriptor在Python中主要被用來定義方法和屬性,使用起來相當具有技巧性,這里我們先從基礎的開始,整理一份Python中的descriptor描述器簡明使用指南

當定義迭代器的時候,描述是實現(xiàn)迭代協(xié)議的對象,即實現(xiàn)__iter__方法的對象。同理,所謂描述器,即實現(xiàn)了描述符協(xié)議,即__get__, __set__, 和 __delete__方法的對象。

單看定義,還是比較抽象的。talk is cheap??创a吧:

class WebFramework(object):
  def __init__(self, name='Flask'):
    self.name = name

  def __get__(self, instance, owner):
    return self.name

  def __set__(self, instance, value):
    self.name = value


class PythonSite(object):

  webframework = WebFramework()

In [1]: PythonSite.webframework
Out[1]: 'Flask'

In [2]: PythonSite.webframework = 'Tornado'

In [3]: PythonSite.webframework
Out[3]: 'Tornado'

定義了一個類WebFramework,它實現(xiàn)了描述符協(xié)議__get__和__set__,該對象(類也是對象,一切都是對象)即成為了一個描述器。同時實現(xiàn)__get__和__set__的稱之為資料描述器(data descriptor)。僅僅實現(xiàn)__get__的則為非描述器。兩者的差別是相對于實例的字典的優(yōu)先級。

如果實例字典中有與描述器同名的屬性,如果描述器是資料描述器,優(yōu)先使用資料描述器,如果是非資料描述器,優(yōu)先使用字典中的屬性。

描述器的調用
對于這類魔法,其調用方法往往不是直接使用的。例如裝飾器需要用 @ 符號調用。迭代器通常在迭代過程,或者使用 next 方法調用。描述器則比較簡單,對象屬性的時候會調用。

In [15]: webframework = WebFramework()

In [16]: webframework.__get__(webframework, WebFramework)
Out[16]: 'Flask'

描述器的應用
描述器的作用主要在方法和屬性的定義上。既然我們可以重新描述類的屬性,那么這個魔法就可以改變類的一些行為。最簡單的應用則是可以配合裝飾器,寫一個類屬性的緩存。Flask的作者寫了一個werkzeug網(wǎng)絡工具庫,里面就使用描述器的特性,實現(xiàn)了一個緩存器。

class _Missing(object):
  def __repr__(self):
    return 'no value'

  def __reduce__(self):
    return '_missing'


_missing = _Missing()


class cached_property(object):
  def __init__(self, func, name=None, doc=None):
    self.__name__ = name or func.__name__
    self.__module__ = func.__module__
    self.__doc__ = doc or func.__doc__
    self.func = func

  def __get__(self, obj, type=None):
    if obj is None:
      return self
    value = obj.__dict__.get(self.__name__, _missing)
    if value is _missing:
      value = self.func(obj)
      obj.__dict__[self.__name__] = value
    return value


class Foo(object):
  @cached_property
  def foo(self):
    print 'first calculate'
    result = 'this is result'
    return result


f = Foo()

print f.foo  # first calculate this is result
print f.foo  # this is result

運行結果可見,first calculate只在第一次調用時候被計算之后就把結果緩存起來了。這樣的好處是在網(wǎng)絡編程中,對HTTP協(xié)議的解析,通常會把HTTP的header解析成python的一個字典,而在視圖函數(shù)的時候,可能不知一次的訪問這個header,因此把這個header使用描述器緩存起來,可以減少多余的解析。

描述器在python的應用十分廣泛,通常是配合裝飾器一起使用。強大的魔法來自強大的責任。描述器還可以用來實現(xiàn)ORM中對sql語句的"預編譯"。恰當?shù)氖褂妹枋銎?,可以讓自己的Python代碼更優(yōu)雅。

相關文章

  • Python基礎教程之利用期物處理并發(fā)

    Python基礎教程之利用期物處理并發(fā)

    這篇文章主要給大家介紹了關于Python基礎教程之利用期物處理并發(fā)的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧。
    2018-03-03
  • python實現(xiàn)簡單飛機大戰(zhàn)小游戲

    python實現(xiàn)簡單飛機大戰(zhàn)小游戲

    這篇文章主要為大家詳細介紹了python實現(xiàn)簡單飛機大戰(zhàn)小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Python實現(xiàn)進程同步和通信的方法

    Python實現(xiàn)進程同步和通信的方法

    本篇文章主要介紹了Python實現(xiàn)進程同步和通信的方法,詳細的介紹了Process、Queue、Pipe、Lock等組件,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • Python深拷貝與淺拷貝引用

    Python深拷貝與淺拷貝引用

    這篇文章主要介紹了Python深拷貝與淺拷貝引用,Python并沒有拷貝這個對象,而只是拷貝了這個對象的引用,下文具體的相關介紹需要的小伙伴可以參考一下
    2022-04-04
  • python隨機打印成績排名表

    python隨機打印成績排名表

    這篇文章主要為大家詳細介紹了python隨機打印成績排名表,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • 對于Python異常處理慎用“except:pass”建議

    對于Python異常處理慎用“except:pass”建議

    這篇文章主要介紹了對于Python異常處理方法的建議,摘選自StackOverflow上的熱門問題的回答,闡述了except:pass的使用時需要注意的地方,需要的朋友可以參考下
    2015-04-04
  • pymssql ntext字段調用問題解決方法

    pymssql ntext字段調用問題解決方法

    pymssql是python用來連接mssql數(shù)據(jù)庫的一個類庫。該庫遵守Python DB API 2.0 標準,并且還附帶了一個原生的低階數(shù)據(jù)訪問模塊。
    2008-12-12
  • Ubuntu權限不足無法創(chuàng)建文件夾解決方案

    Ubuntu權限不足無法創(chuàng)建文件夾解決方案

    這篇文章主要介紹了Ubuntu權限不足無法創(chuàng)建文件夾解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-11-11
  • Python實現(xiàn)的拉格朗日插值法示例

    Python實現(xiàn)的拉格朗日插值法示例

    這篇文章主要介紹了Python實現(xiàn)的拉格朗日插值法,簡單介紹了拉格朗日插值法的原理并結合完整實例形式給出了拉格朗日插值法的具體實現(xiàn)與使用技巧,需要的朋友可以參考下
    2019-01-01
  • Python可變參數(shù)*args和**kwargs用法實例小結

    Python可變參數(shù)*args和**kwargs用法實例小結

    這篇文章主要介紹了Python可變參數(shù)*args和**kwargs用法,結合實例形式總結分析了Python中可變參數(shù)*args和**kwargs的功能、區(qū)別與具體使用技巧,需要的朋友可以參考下
    2018-04-04

最新評論