在子类的方法中使用继承变量的默认参数

时间:2019-05-22 06:12:48

标签: python python-3.x class oop inheritance

我想将继承的变量用作派生类方法的 default 参数之一。我想做类似以下的事情:

class BaseFoo:
  _inherited = 'someval'

class Foo(BaseFoo):
  def dosomething( bar = _inherited ):
    print( bar ) # should print someval if we call dosomething()

我尝试使用super()._ inherited。但是由于super()需要一个实例,因此将其作为默认arg会引发RunTimeError:super()没有参数

我也尝试过使用self._inherited。但是它返回一个NameError,自我未定义。我知道我可以使用self或super()访问函数中的_inherited。但是,如何在定义一些默认参数的同时做到这一点呢?

编辑: 我知道如何访问子类中的继承属性。但是这个问题着重于将它们用作默认参数。对于那些希望访问属性的人,可以参考Accessing attribute from parent class inside child class

2 个答案:

答案 0 :(得分:2)

您实际上不能在函数参数中获取继承的属性,因为此处没有定义self。您可以 @MarkTolonen shows的父级获取class属性。这可能是您想要的,但这不是一回事。

考虑:

class BaseFoo:
    _inherited = 'someval'

class Foo(BaseFoo):
    def someAction(self):
        self._inherited = "other"
    def dosomething(self,bar=BaseFoo._inherited ):
        print( bar, self._inherited ) # should print someval if we call dosomething()

f = Foo()
f.someAction()  # changes f._inherited to "other"
f.dosomething() # what should be printed? self._inherited or bar?
# prints someval other

如果答案仍然是someval,那么这将满足您的需要,但是,如果您希望答案是other,则此方法将不起作用。您将需要使用将默认值设置为None的模式在函数主体中实际设置值,并检查:

class BaseFoo:
    _inherited = 'someval'

class Foo(BaseFoo):
    def someAction(self):
        self._inherited = "other"
    def dosomething(self,bar=None):
        if bar is None:
            bar = self._inherited
        print( bar, self._inherited ) 

f = Foo()
f.someAction()
f.dosomething()
# prints other other

答案 1 :(得分:1)

您可以直接参考基础:

class BaseFoo:
  _inherited = 'someval'

class Foo(BaseFoo):
  def dosomething(self,bar=BaseFoo._inherited ):
    print( bar ) # should print someval if we call dosomething()

输出:

>>> f = Foo()
>>> f.dosomething()
someval