为了账号安全,请及时绑定邮箱和手机立即绑定

从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 关注
  • 227 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号