成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

關(guān)于對象,我犯了一個(gè)錯(cuò)誤

pepperwang / 931人閱讀

摘要:在我的一個(gè)業(yè)務(wù)邏輯代碼中,我不幸需要編寫以下類這里我們用抽象的表示這是兩個(gè)沒有什么問題的對象,不過在創(chuàng)建的實(shí)例時(shí),會(huì)讓自己的屬性指向一個(gè)的實(shí)例,而中的屬性又指向該實(shí)例所以我們可以像下面這樣訪問這樣能夠使得擁有的控制權(quán),也同時(shí)使得擁有的控制權(quán)

在我的一個(gè)業(yè)務(wù)邏輯代碼中,我不幸需要編寫以下類(這里我們用抽象的A, B, C表示)

class A:
   value = 0
   def __init__(self, b):
                self.b = b
    
   def set_1(self):
        self.value = 1
        
class B:
        
    def __init__(self):
        pass
        
    def reset(self):
        self.a = A(self)
 

這是兩個(gè)沒有什么問題的對象,不過在創(chuàng)建B的實(shí)例時(shí),會(huì)讓自己的屬性a指向一個(gè)A的實(shí)例,而a中的屬性b又指向該B實(shí)例
所以我們可以像下面這樣訪問:

b = B()
a = b.a
assert b.a.b is b
assert b.a.b.a is a

這樣能夠使得b擁有a的控制權(quán),也同時(shí)使得a擁有b的控制權(quán)。

但是當(dāng)我試圖用一個(gè)類C來代理實(shí)例b時(shí),卻犯了一個(gè)錯(cuò)誤

class C:
    b = B()
    a = b.a
 
    def __init__(self):
        pass
 
    def read_a(self):
        return self.b.a.value
 
 
c = C()
assert c.read_a() == 0
c.a.set_1()
assert c.read_a() == 1
 
c.b.reset()
assert c.read_a() == 0
assert c.a == 0  # AssertionError

為什么這里我會(huì)腦子抽斷言 c.a == 0呢?
因?yàn)槲抑饔^地認(rèn)為這里實(shí)例b執(zhí)行了reset函數(shù),于是重新實(shí)例化了屬性b.a=A(self)
那么a在實(shí)例過程中,會(huì)讓a.value = 0
所以 c.b.a.value == 0
而我們的c.a = b.a
所以c.a.value == c.b.a.value == 0
幾乎完美的推理!!!

但是我忽略了,這里的c.a is not c.b.a !!!
原因如下:
假設(shè)一開始實(shí)例化A, B 為 a1, b1
c.a -> a1
c.b -> b1
那么當(dāng)b1.reset() 的時(shí)候,a是重新實(shí)例化的一個(gè)A對象,用JAVA的話來說,就是重新new 了一個(gè)A
b1.a -> a2
故c.b.a == c.b1.a == a2
而c.a == a1
a1.value在a1.set_1()之后,賦值為 1
a2.value在b1.reset()之后,賦值為 0
所以斷言錯(cuò)誤

記錄這個(gè)錯(cuò)誤警告自己在今后的編碼過程中不要一味主觀地用數(shù)學(xué)觀點(diǎn),而要弄清楚具體對象。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/41083.html

相關(guān)文章

  • 【debug】事件綁定代碼中的一個(gè)低級錯(cuò)誤導(dǎo)致的內(nèi)存泄漏

    摘要:靜下來想了想發(fā)現(xiàn)我犯了一個(gè)低級錯(cuò)誤。上面的代碼中函數(shù)是在這個(gè)函數(shù)閉包中申明的,在這個(gè)函數(shù)執(zhí)行完畢后,由于它被綁上了事件,引用并不為,所以沒有被回收。 最近寫一個(gè)web應(yīng)用的圖片上傳功能,里面有這么個(gè)場景:點(diǎn)擊上傳按鈕,呼出file input框,選擇完圖片進(jìn)行前端壓縮然后上傳,完畢后將返回的圖片鏈接展示給用戶。這個(gè)功能很常見,但是在這里卻翻了船,所以專門記錄一下這個(gè)bug。 我是這么寫...

    XboxYan 評論0 收藏0
  • laraval模板方法設(shè)計(jì)模式實(shí)現(xiàn)服務(wù)容器

    摘要:當(dāng)我執(zhí)行代碼首次失敗時(shí),我去網(wǎng)上搜尋答案,他們說,你這種實(shí)現(xiàn)模式,就在注冊服務(wù)時(shí),應(yīng)該注冊抽象類,而不是接口類。 1、第一點(diǎn),首先說明設(shè)計(jì)模式跟實(shí)現(xiàn)服務(wù)容器沒關(guān)系 之所以采用這個(gè)標(biāo)題,是因?yàn)樽约寒?dāng)初犯了這種錯(cuò)誤,希望新學(xué)laravel的人不要犯這種跟我一樣的錯(cuò)誤。 2、我定義了接口,同時(shí)抽象類繼承接口,其他具體實(shí)現(xiàn)類繼承抽象類。 當(dāng)我執(zhí)行代碼首次失敗時(shí),我去網(wǎng)上搜尋答案,他們說,你這種...

    newsning 評論0 收藏0
  • 填坑之PHP的yield和協(xié)程在一起的日子里(二)

    摘要:粗暴地說上面的過程就算是協(xié)程的基本概念。多線程和多進(jìn)程都是操作系統(tǒng)參與的調(diào)度,而協(xié)程是用戶自主實(shí)現(xiàn)的調(diào)度,協(xié)程的關(guān)鍵點(diǎn)實(shí)際上是用戶層實(shí)現(xiàn)自主調(diào)度,大概有翻身農(nóng)奴把歌唱的意思。 首先是,這是我第一次把公眾號(hào)文章復(fù)制粘貼到sf.gg來。 其次是,很久很久之前,我挖了一個(gè)yield的一個(gè)坑,自己挖的坑自己填,不然遲早會(huì)把自己埋掉。 最后是,如果想看之前那個(gè)坑,請發(fā)送yield給文章末尾的公眾...

    Scorpion 評論0 收藏0
  • 記錄manjaro linux下起angular + spring + nginx 項(xiàng)目環(huán)境

    摘要:我用的是內(nèi)核是,有些東西和不太一樣所以在起環(huán)境時(shí)遇到了一些沒見過的問題。安裝與這倆我嘗試下載安裝官網(wǎng)上的包,但均以失敗告終,原因不明,還好自帶的軟件庫有最新版,可以很方便地進(jìn)行安裝。甚至還有檢查最新版本依賴的工具,省下了手動(dòng)更新的麻煩。 我用的linux是manjaro,內(nèi)核是arch,有些東西和ubantu,deepin不太一樣,所以在起環(huán)境時(shí)遇到了一些沒見過的問題。 安裝nodej...

    littlelightss 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<