最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

先說說decorator

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

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

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

擦,好像扯遠(yuǎn)了。

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

復(fù)制代碼 代碼如下:

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

def func():
    print 'in func'

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

正題:通過Descriptor來做一個(gè)類級的Property

常見的Property是這樣的:

復(fù)制代碼 代碼如下:

class Foo(object):
    _name = 'the5fire'

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

這中property的使用,是實(shí)例級的應(yīng)用。因?yàn)橹挥性?foo = Foo() 之后,才可以 foo.name 。

但是如果我需要一個(gè)類級的屬性應(yīng)該怎么做呢,就像是 classmethod一樣,不需要實(shí)例化類我就可以調(diào)用。對應(yīng)的需求是這樣的,定義了一個(gè)基類DBManage:

復(fù)制代碼 代碼如下:

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í)行這個(gè)語句的代碼
        return result

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

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

復(fù)制代碼 代碼如下:

class User(DBManage):
    pass

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

class Post(DBManage):
    pass

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

于是自定義了一個(gè)classproperty:

復(fù)制代碼 代碼如下:

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

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

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

復(fù)制代碼 代碼如下:

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

相關(guān)文章

  • Flask response響應(yīng)的具體使用

    Flask response響應(yīng)的具體使用

    在flask中,想要給前端頁面返回?cái)?shù)據(jù),必須是Response的對象,本文介紹了Flask response響應(yīng)的使用,感興趣的可以了解一下
    2021-07-07
  • python模糊圖片過濾的方法

    python模糊圖片過濾的方法

    今天小編就為大家分享一篇python模糊圖片過濾的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • 基于Pygame實(shí)現(xiàn)簡單的貪吃蛇游戲

    基于Pygame實(shí)現(xiàn)簡單的貪吃蛇游戲

    Pygame是一個(gè)專門用來開發(fā)游戲的Python模塊,主要用于開發(fā)、設(shè)計(jì)?2D?電子游戲。本文主要為大家介紹了通過Pygame制作一個(gè)簡單的貪吃蛇游戲,感興趣的同學(xué)可以關(guān)注一下
    2021-12-12
  • Python中Parsel的兩種數(shù)據(jù)提取方式詳解

    Python中Parsel的兩種數(shù)據(jù)提取方式詳解

    在網(wǎng)絡(luò)爬蟲的世界中,數(shù)據(jù)提取是至關(guān)重要的一環(huán),Python 提供了許多強(qiáng)大的工具,其中之一就是 parsel 庫,下面我們就來深入學(xué)習(xí)一下Parsel的兩種數(shù)據(jù)提取方式吧
    2023-12-12
  • Python字典常見操作實(shí)例小結(jié)【定義、添加、刪除、遍歷】

    Python字典常見操作實(shí)例小結(jié)【定義、添加、刪除、遍歷】

    這篇文章主要介紹了Python字典常見操作,結(jié)合實(shí)例形式總結(jié)分析了Python字典的定義、添加、刪除、遍歷等常見使用技巧與操作注意事項(xiàng),需要的朋友可以參考下
    2019-10-10
  • OpenCV半小時(shí)掌握基本操作之分水嶺算法

    OpenCV半小時(shí)掌握基本操作之分水嶺算法

    這篇文章主要介紹了OpenCV基本操作之分水嶺算法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • Python中字典的setdefault()方法教程

    Python中字典的setdefault()方法教程

    在學(xué)習(xí)python字典操作方法時(shí),感覺setdefault()方法,比字典的其它基本操作方法更難理解的同學(xué)比較多,所以想著總結(jié)以下,下面這篇文章主要給大家介紹了Python中字典的setdefault()方法,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-02-02
  • pytorch中tensor的合并與截取方法

    pytorch中tensor的合并與截取方法

    今天小編就為大家分享一篇pytorch中tensor的合并與截取方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • Python實(shí)現(xiàn)數(shù)據(jù)的序列化操作詳解

    Python實(shí)現(xiàn)數(shù)據(jù)的序列化操作詳解

    在日常開發(fā)中,對數(shù)據(jù)進(jìn)行序列化和反序列化是常見的數(shù)據(jù)操作,Python提供了兩個(gè)模塊方便開發(fā)者實(shí)現(xiàn)數(shù)據(jù)的序列化操作,即?json?模塊和?pickle?模塊。本文就為大家詳細(xì)講解這兩個(gè)模塊的使用,需要的可以參考一下
    2022-07-07
  • Python中文分詞庫jieba(結(jié)巴分詞)詳細(xì)使用介紹

    Python中文分詞庫jieba(結(jié)巴分詞)詳細(xì)使用介紹

    這篇文章主要介紹了Python中文分詞庫jieba(結(jié)巴分詞)提取詞,加載詞,修改詞頻,定義詞庫詳細(xì)使用介紹,需要的朋友可以參考下
    2022-04-04

最新評論

肇州县| 启东市| 搜索| 甘孜| 曲靖市| 黄浦区| 岫岩| 磐安县| 天柱县| 天祝| 嘉兴市| 开阳县| 保山市| 宜章县| 三门峡市| 盐池县| 临漳县| 邯郸市| 白山市| 安阳市| 宣城市| 建平县| 运城市| 武功县| 双桥区| 桐柏县| 平和县| 元朗区| 卫辉市| 化德县| 金沙县| 阳山县| 白山市| 贵港市| 吴桥县| 石城县| 平罗县| 虹口区| 奉节县| 纳雍县| 凤翔县|