Можно ли изменить переменную суперкласса из метода подкласса и использовать ее в другом подклассе? - PullRequest
0 голосов
/ 07 мая 2020

Отредактировано: Dou to @Prune comment Я отредактировал вопрос

У меня есть основной класс как суперкласс, и их много классы расширились от него.

Я хочу изменить переменную суперкласса из метода внутри подкласса и использовать его в другом подклассе.

Предположим, что:

class MainClass:
    def __init__(self):
        self.test = 'GOOGLE'   # This is a variable

    def plus(x, y):
        return x + y


class SubClassOne(MainClass):
    def __init__(self):
        super().__init__()


    def substract(self, x, y):
        return x + y
        self.test = 'YAHOO'    # Here I'm trying to change the 'test'


class SubClassTwo(MainClass):
    def __init__(self):
        super().__init__()

    def multiply(self, x, y):
        print(self.test)      # Here I'm printing the 'test' and I want to have it with 'YAHOO' value
        return x * y


run = SubClassTwo()
run.multiply(2,5)

1- Посмотрите на переменную self.test = 'GOOGLE' при инициализации SuperClass.

2- Затем я меняю его в SubClassOne.substract () на self.test = 'YAHOO'.

3- Я использую self.test в SubClassTwo, чтобы получить изменения из SubClassOne .

Означает, что если я напечатаю его, я хочу получить YAHOO на выходе. Но фактический результат будет GOOGLE

Что мне делать?

Ответы [ 3 ]

1 голос
/ 07 мая 2020

У вас есть критический недостаток в ваших проектных предположениях:

3- Я использую self.test в SubClassTwo, чтобы получить изменения из SubClassOne.

Нет, вы не надо. SubClassTwo и SubClassOne являются дочерними подклассами. self.test в SubClassTwo относится к атрибуту test экземпляра SubClassTwo; SubClassOne не является частью этой родословной. SubClassTwo наследует только от MainClass. Изменение атрибута test экземпляра SubClassOne не может автоматически влиять на экземпляр SubClassTwo.

В вашем комментарии к старому ответу я вижу, в чем может быть ваша проблема:

методы во время выполнения идут последовательно в порядке, ClassOne, затем Class Two

Вы объявили два дочерних классов , независимо друг от друга, not методов. substract() [sic] и multiply - это методы двух разных классов. Например, если бы вы попробовали в конце опубликованного кода

print(run.substract(5, 2))

, вы бы получили ошибку времени выполнения: run не имеет метода с именем substract - run имеет тип SubClassTwo , у которого нет такого метода. substract - это метод только SubClassOne.


Очень просто, вам нужно определить, что вы хотите, чтобы ваши объекты выполняли, а затем написать соответствующие структуры Python для сопоставления. Поскольку вы недостаточно рассказали нам о желаемой операции, мы не можем изменить ваш опубликованный код для соответствия. Для простой установки атрибута экземпляра требуется только один класс, а не три.

0 голосов
/ 07 мая 2020

Вы можете сделать SubClassTwo наследовать от SubClassOne, так как он также унаследует это переопределяющее поведение:

class SubClassTwo(SubClassOne):
    def multiply(self, x, y):
        print(self.test)  # prints "YAHOO"
        return x * y
0 голосов
/ 07 мая 2020

Вы не можете получить YAHOO как вывод self.test второго класса, атрибуты и методы классов работают таким образом: B наследуется от A, когда вы создаете объект, и вы пытаетесь выполнить метод или класс этого объекта, он будет сначала найден в классе A, затем в B, поэтому, если он не будет повторно объявлен в B, он покажет один A, что и происходит в вашем случае, атрибут self.test не повторно объявляется в SubClassTwo, так что это нормально, что в качестве вывода будет отображаться GOOGLE, вам также необходимо переопределить его для этого подкласса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...