国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

關于對象,我犯了一個錯誤

pepperwang / 928人閱讀

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

在我的一個業務邏輯代碼中,我不幸需要編寫以下類(這里我們用抽象的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)
 

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

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

這樣能夠使得b擁有a的控制權,也同時使得a擁有b的控制權。

但是當我試圖用一個類C來代理實例b時,卻犯了一個錯誤

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

為什么這里我會腦子抽斷言 c.a == 0呢?
因為我主觀地認為這里實例b執行了reset函數,于是重新實例化了屬性b.a=A(self)
那么a在實例過程中,會讓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 !!!
原因如下:
假設一開始實例化A, B 為 a1, b1
c.a -> a1
c.b -> b1
那么當b1.reset() 的時候,a是重新實例化的一個A對象,用JAVA的話來說,就是重新new 了一個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
所以斷言錯誤

記錄這個錯誤警告自己在今后的編碼過程中不要一味主觀地用數學觀點,而要弄清楚具體對象。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/41083.html

相關文章

  • 【debug】事件綁定代碼中的一個低級錯誤導致的內存泄漏

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

    XboxYan 評論0 收藏0
  • laraval模板方法設計模式實現服務容器

    摘要:當我執行代碼首次失敗時,我去網上搜尋答案,他們說,你這種實現模式,就在注冊服務時,應該注冊抽象類,而不是接口類。 1、第一點,首先說明設計模式跟實現服務容器沒關系 之所以采用這個標題,是因為自己當初犯了這種錯誤,希望新學laravel的人不要犯這種跟我一樣的錯誤。 2、我定義了接口,同時抽象類繼承接口,其他具體實現類繼承抽象類。 當我執行代碼首次失敗時,我去網上搜尋答案,他們說,你這種...

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

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

    Scorpion 評論0 收藏0
  • 記錄manjaro linux下起angular + spring + nginx 項目環境

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

    littlelightss 評論0 收藏0

發表評論

0條評論

pepperwang

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<