gpt4 book ai didi

python - 如果派生类中的属性被覆盖,如何调用基类的数据成员?

转载 作者:太空狗 更新时间:2023-10-30 00:28:53 33 4
gpt4 key购买 nike

这个问题类似于this other one , 不同之处在于基类中的数据成员被描述符协议(protocol)包裹。

换句话说,如果我用派生类中的属性覆盖其名称,我如何访问基类的成员?

class Base(object):
def __init__(self):
self.foo = 5

class Derived(Base):
def __init__(self):
Base.__init__(self)

@property
def foo(self):
return 1 + self.foo # doesn't work of course!

@foo.setter
def foo(self, f):
self._foo = f

bar = Base()
print bar.foo

foobar = Derived()
print foobar.foo

请注意,我还需要定义一个 setter,否则基类中 self.foo 的赋值将不起作用。

总而言之,描述符协议(protocol)似乎不能很好地与继承交互...

最佳答案

如果使用委托(delegate)而不是继承,生活会更简单。这是 python 。您没有义务从 Base 继承。

class LooksLikeDerived( object ):
def __init__( self ):
self.base= Base()

@property
def foo(self):
return 1 + self.base.foo # always works

@foo.setter
def foo(self, f):
self.base.foo = f

但是Base的其他方法呢?您在 LooksLikeDerived 中复制名称并简单地复制。

def someMethodOfBase( self, *args, **kw ):
return self.base.someMethodOfBase( *args **kw )

是的,感觉不“干”。但是,当您尝试将某些类“包装”在新功能中时,它可以防止出现很多问题。

关于python - 如果派生类中的属性被覆盖,如何调用基类的数据成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1057518/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com