91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python中attrs如何提高面向對象編程效率

發布時間:2021-09-27 10:45:32 來源:億速云 閱讀:176 作者:小新 欄目:開發技術

小編給大家分享一下Python中attrs如何提高面向對象編程效率,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

前言:

Python是面向對象的語言,一般情況下使用面向對象編程會使得開發效率更高,軟件質量更好,并且代碼更易于擴展,可讀性和可維護性也更高。但是如果在一個較大的項目中,如果實體類非常多并且有非常復雜的屬性,你就會逐漸覺得Python的類寫起來是真·“累”。為什么這樣說,看下下面這個Box類,屬性有長(length)、寬(width)、高(hight):

class Box:
     def __init__(self, length, width, hight):
         
         self.length = length
         self.width = width
         self.hight = hight

這樣倒沒有什么問題,而且是符合Python規范的寫法,初始化函數內每一個參數都需要用self.xxx = xxx進行賦值,參數少了還好,但是如果參數過多了,只是參數賦值操作都夠寫一會的了,如果一個項目中類也有很多,那就真的要麻木了。

而且我們知道,在Python中,想要自定義對象本身的打印輸出結果的時候,需要在它的類中實現__repr__() 方法,例如:

def __repr__(self):
        return '{}(length={}, width={}, hight={})'.format(
            self.__class__.__name__, self.length, self.width, self.hight)

實現了__repr__() 方法,當我們打印對象本身的時候,才會輸出我們自定義的字符。

box = Box(20, 15, 15)
print(box)
# 結果輸出為 Box(length=20, width=15, hight=15)

但是有時會因為麻煩,我們不愿意去實現__repr__()方法,但是不實現打印結果又不友好,就陷入了糾結之中。

如果我么想要實現對象比較,有時候需要判斷2個對象是否相等或者比較大小,就要實現__eq__()__lt__() 、__gt__()等各種方法來實現對象之間的比較,例如:

def __eq__(self, other):
    if not isinstance(other, self.__class__):
        return NotImplemented
    return (self.length, self.width, self.hight) == (
        other.length, other.width, other.hight)

這樣我們又需要實現這幾個用于比較的方法。 比如說我們已經實現了上面說過的所有方法,然后又突然添加一個屬性結實度hardness,那么整個類的方法都需要修改,這是非常折磨人的。 那么有沒有一種方法,可以在創建類的時候自動添加上類似于上面提到的這些東西,答案是有的,那就是我們接下來要介紹的attrs模塊,它可以幫助我們很方便的定義類。

1、attrs的使用

我們可以使用pip install attrs進行安裝。

然后將上面的代碼改造一下:

from attr import attrs, attrib


@attrs
class Box:
    length = attrib(type=int, default=0)
    width = attrib(type=int, default=0)
    hight = attrib(type=int, default=0)


box1 = Box(20, 15, 15)
print(box1)
box2 = Box(30, 20, 20)
print(box2 == box1)
print(box2 > box1)

用模塊內的attrs修飾了Box類,再使用attrib定義所有的屬性,同時指定了屬性的類型和默認值。而且我們沒有實現任何一個上面所提到的方法,但是確實實現了所有的功能。 現在如果我們添加一個屬性顏色color,這個屬性不參與對象的比較,但是打印的時候要輸出,添加一個屬性結實度hardness,這個屬性參與對象的比較,但是打印對象的時候不輸出,就非常簡單了:

from attr import attrs, attrib


@attrs
class Box:
    length = attrib(type=int, default=0)
    width = attrib(type=int, default=0)
    hight = attrib(type=int, default=0)
    color = attrib(repr=True, cmp=False, default=(0, 0, 0))
    hardness = attrib(repr=False, cmp=True, default=0)


box1 = Box(20, 15, 15, (255, 255, 255), 80)
print("box1:", box1)
box2 = Box(20, 15, 15, (255, 255, 0), 100)
print("box2:", box2)
print(box2 == box1)
print(box2 > box1)

執行結果為:

Python中attrs如何提高面向對象編程效率

也就是說,如果我們用了attrs庫的話,會讓類的定義變得高效簡潔,就不需要再寫哪些冗余又復雜的代碼了。 關于attrib() 接收以下參數:

  • default:屬性的默認值,如果沒有傳入初始化數據,那么就會使用默認值

  • validator:驗證器,檢查傳入的參數是否合法

  • repr:是否參與對象打印時的輸出

  • cmp:是否參與對象比較

  • hash:是否進行去重

  • init:是否參與初始化,如果為False,那么這個參數不能當做類的初始化參數,默認是True

  • metadata:元數據,只讀性的附加數據

  • type:類型,比如 int、str 等各種類型,默認為 None

  • converter:轉換器,進行一些值的處理和轉換器,增加容錯性

  • kw_only:是否為強制關鍵字參數,默認為 False

這里我們只重點說一下驗證器和轉換器,其他的參數都很好理解。

2、驗證器

有時候在設置一個屬性的時候必須要滿足某個條件,比如上面的顏色color屬性,我們使用的是RGB三原色方式,例如黑色是(255,255,255),對于這種情況,我們就需要驗證屬性是否合法。

例如:

def color_is_valid(instance, attr, value):
    if not isinstance(value, set):
        raise ValueError(f"參數{attr.name}:{value}不合法!")
    for i in value:
        if not 0 <= i<= 255:
            raise ValueError(f"參數{attr.name}:{value}不合法!")




@attrs
class Box:
    length = attrib(type=int, default=0)
    width = attrib(type=int, default=0)
    hight = attrib(type=int, default=0)
    color = attrib(repr=True, cmp=False, validator=color_is_valid, default=(0, 0, 0))
    hardness = attrib(repr=False, cmp=True, default=0)


box1 = Box(20, 15, 15, (255, 255, 260), 80)

執行結果為:

Python中attrs如何提高面向對象編程效率

上述代碼中定義了一個驗證器color_is_valid()方法來驗證顏色color是否合法,不合法時就會拋異常。

驗證器方法接收三個參數:

  • instance:類對象

  • attr:屬性名

  • value:屬性值

而且attrs模塊也提供了許多內置驗證器,這里就不做贅述了。

3、轉換器

轉換器主要做一些值的處理和轉換,增加類的容錯性,比如一個屬性接收的是int類型,我們想要的是傳入了數字字符串也不會報錯,那我們就可以增加轉換器,將字符串自動轉為數字,例如:

def to_int(value):
    try:
        return int(value)
    except:
        return None


@attrs
class Box:
    length = attrib(type=int, default=0, converter=to_int)
    width = attrib(type=int, default=0, converter=to_int)
    hight = attrib(type=int, default=0)
    color = attrib(repr=True, cmp=False, default=(0, 0, 0))
    hardness = attrib(repr=False, cmp=True, default=0)


box1 = Box("20", "15", 15, (255, 255, 255), 80)
print("box1:", box1)
box2 = Box("2a", 15, 15, (255, 255, 0), 100)
print("box2:", box2)

Python中attrs如何提高面向對象編程效率

上面定義了一個方法to_int() ,可以將值轉化為數字類型,轉換異常就返回None,這樣容錯性非常高了。

以上是“Python中attrs如何提高面向對象編程效率”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

四会市| 资阳市| 开封市| 磐安县| 浏阳市| 沁阳市| 信丰县| 许昌县| 五原县| 彭水| 台山市| 辽阳县| 山阴县| 绍兴县| 临湘市| 文安县| 株洲市| 内江市| 布尔津县| 新昌县| 宜城市| 通江县| 乌拉特前旗| 区。| 呼伦贝尔市| 神农架林区| 牟定县| 青海省| 江津市| 天柱县| 石棉县| 万载县| 潮安县| 腾冲县| 岢岚县| 天津市| 鹤庆县| 涡阳县| 庆云县| 汾西县| 钦州市|