如何用派生类中的属性重写基类中的字段?

2024-06-02 07:39:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个使用字段的基类:

class Base(object):
    def __init__(self, member):
        self.member = member

以及一个派生类,该类希望将其提升为属性,并添加一些行为:

^{pr2}$

但是,这不能正确地委托给基类:

>>> d = Derived(0)
intercepting setter

Traceback (most recent call last):
  File "<pyshell#8>", line 1, in <module>
    d = Derived(0)
  File "<pyshell#3>", line 3, in __init__
    self.member = 2
  File "<pyshell#6>", line 9, in member
    super(Derived, self).member = value
AttributeError: 'super' object has no attribute 'member'

我该怎么做?在


Tags: inselfbaseobjectinitdefline基类
2条回答

我认为将成员提升为属性是正确的方法。这就像在基类中有一个int成员,并将其更改为派生类中的方法。或者像拥有一个普通方法并在继承器中将其更改为静态或类方法。我想这只是打破了这个概念。在

你有几个选择来解决这个问题。在

引入一个不同(相似)名称的属性,然后将所有访问权转发给继承的原始名称如何?这将非常简单,不会破坏从基类继承的任何内容。但它也不允许拦截对原始成员的访问(在基类中或任何时候)。在

二。完全替换继承的成员。这意味着将值存储在另一个成员中,并完全从头开始创建属性。然后让它访问原始文件的存储:

class Base(object):

    def __init__(self, member):
        self.member = member

    def baseAccess(self):
        return self.member

class Derived(Base):
    @property
    def member(self):
        print "getter",
        return self.memberStore

    @member.setter
    def member(self, value):
        print "setter",
        self.memberStore = value

b = Base(24)
print "Base(24)"
print "b.member", b.member
print "b.baseAccess()", b.baseAccess()
d = Derived(23)
print "Derived(23)"
print "d.member", d.member
print "d.baseAccess()", d.baseAccess()

b.member = 43
print "b.member = 43"
print "b.member", b.member
print "b.baseAccess()", b.baseAccess()
d.member = 42
print "d.member = 42"
print "d.member", d.member
print "d.baseAccess()", d.baseAccess()

这是输出:

^{pr2}$

所以所有的拦截器都被适当地考虑进去了。在

您试图访问super的member,就好像它是一个类属性一样。尝试使用:

class Derived(Base):
    @property
    def member(self):
        print "intercepting getter"
        return self._member

    @member.setter
    def member(self, value):
        print "intercepting setter"
        self._member = value

相关问题 更多 >