Использование унаследованных переменных в методе подкласса в качестве аргументов по умолчанию - PullRequest
0 голосов
/ 22 мая 2019

Я хотел бы использовать унаследованную переменную в качестве одного из аргументов default для метода производного класса.Я хочу сделать что-то похожее на следующее:

class BaseFoo:
  _inherited = 'someval'

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

Я пытался использовать super () ._ унаследовано.Но так как super () нужен экземпляр, то его установка в качестве аргумента по умолчанию вызовет RunTimeError: super () без аргументов

Я также пытался использовать self._inherited.Но он возвращает NameError, самоопределение не определено.Я знаю, что могу получить доступ к _inherited внутри функции с помощью self или super ().Но как мне это сделать при определении некоторых аргументов по умолчанию?

Редактировать: Я знаю, как получить доступ к унаследованным атрибутам в подклассах.Но этот вопрос фокусируется на использовании их в качестве аргументов по умолчанию.Те, кто ищет доступ к атрибутам, могут обратиться к Доступ к атрибуту из родительского класса внутри дочернего класса

Ответы [ 2 ]

2 голосов
/ 22 мая 2019

Вы не можете получить унаследованное свойство в аргументе функции, потому что 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
1 голос
/ 22 мая 2019

Вы можете обратиться к базе напрямую:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...