亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從Python的子類中刪除屬性

從Python的子類中刪除屬性

DIEA 2021-03-11 15:10:55
有什么方法可以從父類中存在的子類中刪除屬性?在下面的例子中class A(object):    foo = 1    bar = 2class B(A):    pass# <desired code here>b = B()assert hasattr(b, 'bar') == False我們可以編寫任何代碼來使斷言通過嗎?
查看完整描述

2 回答

?
縹緲止盈

TA貢獻2041條經驗 獲得超4個贊

是的,使用描述符的魔力。請參閱我的博客文章。精簡版:


class nosubclasses(object):

    def __init__(self, f, cls):

        self.f = f

        self.cls = cls

    def __get__(self, obj, type=None):

        if type == self.cls:

            if hasattr(self.f, '__get__'):

                return self.f.__get__(obj, type)

            return self.f

        raise AttributeError

例子:


In [2]: class MyClass(object):

   ...:     x = 1

   ...:


In [3]: MyClass.x = nosubclasses(MyClass.x, MyClass)


In [4]: class MySubclass(MyClass):

   ...:     pass

   ...:


In [5]: MyClass.x

Out[5]: 1


In [6]: MyClass().x

Out[6]: 1


In [80]: MySubclass.x

---------------------------------------------------------------------------

AttributeError                            Traceback (most recent call last)

<ipython-input-80-2b2f456dd101> in <module>()

----> 1 MySubclass.x


<ipython-input-51-7fe1b5063367> in __get__(self, obj, type)

      8                 return self.f.__get__(obj, type)

      9             return self.f

---> 10         raise AttributeError


AttributeError:


In [81]: MySubclass().x

---------------------------------------------------------------------------

AttributeError                            Traceback (most recent call last)

<ipython-input-81-93764eeb9948> in <module>()

----> 1 MySubclass().x


<ipython-input-51-7fe1b5063367> in __get__(self, obj, type)

      8                 return self.f.__get__(obj, type)

      9             return self.f

---> 10         raise AttributeError


AttributeError:

但是,正如評論者@delnan指出的那樣,這違反了Liskov可替換性原則。我的博客文章中的動機是有根據的,因為該屬性未描述對象本身。但總的來說,這首先破壞了能夠進行子類化的整個目的,而這實際上就是擁有類的全部要點。


順便說一下,我的答案和@jamylak的區別在于,在@jamylak的答案中,每個子類都刪除了屬性。如果您制作了class C(A),它仍將具有bar屬性。在我的回答中,類本身(實際上是屬性)不允許子類具有該屬性,因此,一口氣,所有子類都沒有該屬性。


查看完整回答
反對 回復 2021-03-26
  • 2 回答
  • 0 關注
  • 239 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號