欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python中用Descriptor實現(xiàn)類級屬性(Property)詳解

 更新時間:2014年09月18日 13:08:36   投稿:junjie  
這篇文章主要介紹了Python中用Descriptor實現(xiàn)類級屬性(Property)詳解,本文先是講解了decorator是什么,然后給出了通過Descriptor來做一個類級的Property實例,需要的朋友可以參考下

上篇文章簡單介紹了python中描述器(Descriptor)的概念和使用,有心的同學估計已經Get√了該技能。本篇文章通過一個Descriptor的使用場景再次給出一個案例,讓不了解情況的同學可以更容易理解。

先說說decorator

這兩個單詞確實是有些相似,同時在使用中也是形影不離。這也給人造成了理解上的困難,說裝飾器和描述器到底是怎么回事,為什么非得用一個@符號再加上描述器才行。

很多文章也都把這倆結合著講,我自己看完之后都會覺得很繞。其實學習一個知識點,和做項目開發(fā)一個功能是一樣的。在功能拆分的時候我們都會盡量的把任務拆分的足夠小,然后才分配到開發(fā)者頭上。這樣保證各個任務的獨立性,完整性,并且易于做進度管理。在任務開發(fā)的時候也不能把你的任務都放到一個函數(shù)/接口中去做,以避免各功能間產生高耦合的狀況,導致后期難以維護。

再說回到學習一個技術點,如果你總是嘗試一下子就要掌握兩個或多個技術點,結果可能是忙活了半天,發(fā)現(xiàn)還是暈頭轉向。

擦,好像扯遠了。

說Descriptor是Descriptor, Decorator是Decorator,遇到不懂的地方,各個擊破,哪里不懂點哪里。所以先說Decorator, 關鍵點是你要意識到這就是一個語法糖 。所謂語法糖就是讓你可以用簡單的方式寫代碼。本質上裝飾器(Decorator)就是這樣:

復制代碼 代碼如下:

def decorator(func):
    def wrapper():
        print 'in decorator'
        func()
    return wrapper

def func():
    print 'in func'

# 把func裝飾一下
func = decorator(func)  # 左邊的func其實是那個wrapper, 你執(zhí)行它的時候會,它會幫你執(zhí)行func()
# 等同于你在定義func的時候加上@
@decorator
def func():
    print 'in func'

正題:通過Descriptor來做一個類級的Property

常見的Property是這樣的:

復制代碼 代碼如下:

class Foo(object):
    _name = 'the5fire'

    @property
    def name(self):
        return self._name

這中property的使用,是實例級的應用。因為只有在 foo = Foo() 之后,才可以 foo.name 。

但是如果我需要一個類級的屬性應該怎么做呢,就像是 classmethod一樣,不需要實例化類我就可以調用。對應的需求是這樣的,定義了一個基類DBManage:

復制代碼 代碼如下:

class DBManage(object):
    @classmethod
    def table_name(cls):
        return cls.__name__.lower()

    @classmethod
    def select_all(cls):
        sql = "SELECT * FROM %s""" % cls.table_name()
        # 執(zhí)行這個語句的代碼
        return result

這其實一個對應著數(shù)據庫中某張表的基礎模型,我希望其他的Model都來繼承它,然后可以重用這個table_name的方法(目前還是方法)。

我只需要這么定義User模型即可:

復制代碼 代碼如下:

class User(DBManage):
    pass

然后這么定義Post模型:
復制代碼 代碼如下:

class Post(DBManage):
    pass

這樣我如果需要查所有的User數(shù)據,只需要 User.select_all() 即可,同理Post也是如此 Post.select_all() 。但此時發(fā)現(xiàn)一個有點不爽的事情。那就是基類中的 cls.table_name() 這個代碼,table_name看起來就是屬性,卻需要用調用方法的方式獲取。不妥。

于是自定義了一個classproperty:

復制代碼 代碼如下:

class classproperty(object):
    def __init__(self, func):
        self.func = func

    def __get__(self, instance, klass):
        return self.func(klass)

這需要這樣,我在DBManage中的代碼就可以改為:

復制代碼 代碼如下:

class DBManage(object):
    @classproperty
    def table_name(cls):
        return cls.__name__.lower()

    @classmethod
    def select_all(cls):
        sql = "SELECT * FROM %s""" % cls.table_name  # 多么直觀


這就是Descriptor另外的一個使用案例了。
可能有人或有一個小疑問:為毛你不是在sql賦值時直接 sql = "SELECT * FROM %s" % cls.__name__.lower() 。這個問題,問的非常好,原因就一個字:懶。懶得以后每次都得敲那么多代碼。

相關文章

  • 跟老齊學Python之坑爹的字符編碼

    跟老齊學Python之坑爹的字符編碼

    本文主要介紹了在Python2.x中的編碼問題,非常的坑爹,不過如果用python3,坑爹的編碼問題就不煩惱了。
    2014-09-09
  • Python數(shù)據結構dict常用操作代碼實例

    Python數(shù)據結構dict常用操作代碼實例

    這篇文章主要介紹了Python數(shù)據結構dict常用操作代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • 超詳細,教你用python語言實現(xiàn)QQ機器人制作教程

    超詳細,教你用python語言實現(xiàn)QQ機器人制作教程

    這篇文章主要介紹了如何python語言實現(xiàn)QQ機器人,用圖文詳細的描述了其中的操作步驟,非常的簡單易上手,有需要的朋友可以參考下
    2021-08-08
  • 六個竅門助你提高Python運行效率

    六個竅門助你提高Python運行效率

    這篇文章主要介紹了六個竅門助你提高Python運行效率,本文講解了關鍵代碼使用外部功能包、在排序時使用鍵、針對循環(huán)的優(yōu)化、使用較新的Python版本等優(yōu)化竅門,需要的朋友可以參考下
    2015-06-06
  • Keras中的兩種模型:Sequential和Model用法

    Keras中的兩種模型:Sequential和Model用法

    這篇文章主要介紹了Keras中的兩種模型:Sequential和Model用法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • python實現(xiàn)電子詞典

    python實現(xiàn)電子詞典

    這篇文章主要為大家詳細介紹了python實現(xiàn)電子詞典,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2014-01-01
  • python3訪問sina首頁中文的處理方法

    python3訪問sina首頁中文的處理方法

    如果用python3的urllib或python2的urllib2訪問網頁,都不能得到正確的中文字符串,看下面的解決方法
    2014-02-02
  • Pandas?缺失數(shù)據處理代碼匯總

    Pandas?缺失數(shù)據處理代碼匯總

    這篇文章主要介紹了Pandas?缺失數(shù)據處理代碼匯總,在pandas中,缺失數(shù)據顯示為NaN。缺失值有3種表示方法,np.nan,none,pd.NA,更多相關介紹需要的朋友可以參考下面文章內容
    2022-06-06
  • 用Python selenium實現(xiàn)淘寶搶單機器人

    用Python selenium實現(xiàn)淘寶搶單機器人

    今天給大家?guī)淼氖顷P于Python實戰(zhàn)的相關知識,文章圍繞著用Python selenium實現(xiàn)淘寶搶單機器人展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • 手把手教你Windows如何在cmd中切換python版本

    手把手教你Windows如何在cmd中切換python版本

    通常在Windows系統(tǒng)下我們可能安裝了多個Python版本,那么該如何進行版本的切換呢?下面這篇文章主要給大家介紹了關于Windows如何在cmd中切換python版本的相關資料,需要的朋友可以參考下
    2023-04-04

最新評論