Я хотел бы использовать унаследованную переменную в качестве одного из аргументов По умолчанию для метода производного класса. Я хочу сделать что-то похожее на следующее:
class BaseFoo:
_inherited = 'someval'
class Foo(BaseFoo):
def dosomething( bar = _inherited ):
print( bar ) # should print someval if we call dosomething()
Я пытался использовать super()._inherited. Но поскольку super() нужен экземпляр, установка его в качестве аргумента по умолчанию вызовет ошибку RunTimeError: super() нет аргументов
Я также пытался использовать self._inherited. Но он возвращает NameError, сам не определен. Я знаю, что могу получить доступ к _inherited внутри функции с помощью self или super(). Но как мне это сделать при определении некоторых аргументов по умолчанию?
Редактировать : Я знаю, как получить доступ к унаследованным атрибутам в подклассах. Но этот вопрос фокусируется на использовании их в качестве аргументов по умолчанию. Для тех, кто ищет доступ к атрибутам, может обратиться к Доступ к атрибуту из родительского класса внутри дочернего класса
Вы можете обратиться к базе напрямую:
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
Вы не можете получить свойство унаследовал в аргументе функции, потому что self
там не определено. Вы могу получаете свойство класса от родителя, который @MarkTolonen показывает. Это может быть то, что вы хотите, но это не одно и то же.
Рассмотреть возможность:
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
Возможный дубликат Доступ к атрибуту из родительского класса внутри дочернего класса