Python小知識之物件的比較

米洛丶發表於2021-10-12

好久不見

國慶回了趟老家,躺平了10天。作息時間基本和小學生差不多,8、9點就睡了, 那滋味別提多舒服了。時間也和小時候過得一樣慢了...長時間不更新,還是不行滴,粉都快掉沒了。

今天就結合日常生活的例子,給大家講講Python物件之間的比較。(內容不多,小娃兒都能看懂

場景

米洛今年國慶節打算給新家添置一些日用的東西,比如床、四件套等等。為此,他使用了各大電商平臺的app,但因為是新家,所以有些app還沒有錄入地址。

於是他乾脆進行了一波整理,在他的收貨地址裡面,找尋自己是否新增過最新的地址。

他去掉了一些失效地址

我們都知道,收貨地址最重要的就是地址+電話了,通過這個可以確定一個人。因為有些英雄美女喜歡把姓名寫成: 喵星人吳彥祖這樣的,所以只要確保地址和電話對得上就行。

那我們就需要比較地址是否有重複的,這樣就好好管理自己的收貨地址嘛。

程式碼裡的收貨地址

我們定義一個Receiver類,裡面有name/address/mobile3個欄位:

class Receiver(object):

    def __init__(self, name, addr, mobile):
        self.name = name
        self.addr = addr
        self.mobile = mobile


if __name__ == "__main__":
    r = Receiver("小孟", "梅苑小區", 13922222222)
    r2 = Receiver("小孟貨", "梅苑小區", 13922222222)
    print(r == r2)

這樣我們的生活就對映到了程式碼之中。由於我們要比較,所以我們這邊new了2個收貨地址

我們想要的是,當addr和mobile一致的時候,我們確定這2個收貨地址相同

來看看執行效果:

可以看到,並不ok

因為r和r2是2個不同的物件,所以他們是肯定不相等的。

思考: 如果是單例模式的class,r等於r2嗎?

瞭解__eq__方法

我們知道,在Python裡面比較數字/字串是否相等,那2個物件是否相等。其實也是可以比較的。這一切都要歸功於__eq__這個方法。

我們編寫__op__方法

可以看到有個向上的箭頭,這個代表子類重寫了父類的方法。我們點選一下:

可以看到跳轉到了object的定義,而Python的類都是繼承自object的,所以子類也就帶有了__eq__方法

在我們比較2個物件的時候: r == r2, 實際上是執行了這樣的方法:

r.__eq__(r2)

不信我們們試試:

實現

熟悉了__eq__以後,我們問題就迎刃而解了。我們只需要在__eq__方法裡面寫上對應的判斷方法即可。

class Receiver(object):

    def __init__(self, name, addr, mobile):
        self.name = name
        self.addr = addr
        self.mobile = mobile

    def __eq__(self, other):
        return self.addr == other.addr and self.mobile == other.mobile


if __name__ == "__main__":
    r = Receiver("小孟", "梅苑小區", 13922222222)
    r2 = Receiver("小孟", "梅苑小區", 13922222222)
    print(r == r2)

擴充套件

既然能夠比較物件是否相等,那能否比較物件大小呢?那就等大家自己探索了,關鍵字:

lt, gt, ge, le

另外,還有__str__, __repr__, __hash__等方法,大家感興趣也可以自己重寫著玩玩。

相關文章