Как вернуть значение, вычисленное путем переопределения метода из подкласса, в метод базового класса в python - PullRequest
0 голосов
/ 10 марта 2012

У меня есть базовый класс, подобный этому:

class base(object):
    name = ""
    def __init__(self,name):
        self.user =user
    def context(self,value):
        return {}

Вместо этого я создал другой подкласс и переопределил этот выше "контекстный" метод:

class override(base):
    name = "New class"
    def context(self, value):
        a = []
        a = "hello","b"
        return a

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

Когда я вызываю эту функцию base.context из другого файла.Должны произойти следующие вещи:

  1. Список, т. Е. "a" (в методе переопределения контекста) должен сначала вернуть свое значение методу базового контекста.

  2. После получения значения из метода override.context base.context вернет это значение туда, откуда оно вызывается, после внесения в него некоторых изменений.

Но, когда я вызываю этот base.description метод, он возвращает значение непосредственно из override.description метода.Так что я не могу внести эти изменения в него: (

Ответы [ 2 ]

3 голосов
/ 10 марта 2012

Несколько вопросов в вашем вопросе немного сбивают с толку, но я думаю, что вам нужно что-то вроде этого примера (python2.7):

class base(object):
    name = ""

    def __init__(self, name):
        self.user =user

    def context(self, value):
        return [value]


class override(base):
    name = "override"

    def context(self, value):
        base_context = super(override, self).context(value)
        a = ["hello", "a"] + base_context

    def description(self):
        return "override description"

Вы можете сделать следующее:

>>> a = override()
>>> override.context("value")
["hello", "a", "value"]
>>> override.description()
"override description"

Однако вызов этих методов для base дает разные результаты:

>>> a = base()
>>> a.context("value")
["value"]
>>> base.description()
Traceback (most recent call last):
    ...
AttributeError: 'base' has no attribute 'description'

Хотя не совсем понятно, хотите ли вы этого, потому что вы ссылаетесь на base.context получениезначение от override.context, тогда как обычно это происходит наоборот.То же самое касается override.description.Если вы действительно хотите, чтобы base.context получил значение из override.context, это можно сделать с помощью base.__subclasses__(), но вам придется иметь дело со всеми подклассами base, и этот вид использования крайне редок (и обычно нежелателен).).

2 голосов
/ 10 марта 2012

Используйте super(override, self).context(value), чтобы получить context из base класса.

Но ваш пример немного сбивает с толку, потому что:

1) base.context возвращает dict

2) переменная a в override.context устанавливается в список, затем в кортеж, поэтому override.context возвращает кортеж

...