Как сделать локальную переменную метода Superclass доступной для подкласса, где суперкласс вызывается другим классом - PullRequest
1 голос
/ 15 марта 2019

Как вы видите код, у меня есть суперкласс bar_for_foo_mixin(), и у меня есть подкласс myfoo(bar_for_foo_mixin): Я вычисляю операцию self.Z = X+Y в bar() методе суперкласса.

Теперь яхотите, чтобы self.z = 0 был обновлен до вычисления, выполненного в методе bar (), и замените это значение на подкласс myfoo(bar_for_foo_mixin): и используйте его внутри подкласса.

class bar_for_foo_mixin():
    def __init__(self):
        self.z = 0

    def bar(self, q):
        x = 2
        y = 8
        self.z = x + y + q


class oldfoo():
    def __init__(self):
        pass

    var = bar_for_foo_mixin()
    var.bar(10)


class myfoo(bar_for_foo_mixin):
    def __init__(self):
        super(myfoo, self).__init__()

    def hello(self):
        print("hello", self.z)


final = myfoo()
final.hello()

Результат кода:

hello 0

Ожидаемый результат:

hello 20

Ответы [ 2 ]

1 голос
/ 15 марта 2019

Экземпляр bar_for_foo_mixin, хранящийся в вашей переменной класса oldfoo.var, является совершенно отдельным экземпляром от объекта myfoo, который вы создали в основной программе, поэтому их переменная экземпляра z не будет общей.

Если вы хотите, чтобы переменная была общей для всех экземпляров класса, вы должны вместо этого сделать ее переменной класса и создать методы, предназначенные для обновления переменных класса, такие как bar_for_foo_mixin.bar, вместо этого метод класса:

class bar_for_foo_mixin():
    z = 0

    @classmethod
    def bar(cls, q):
        x = 2
        y = 8
        cls.z = x + y + q


class oldfoo():
    def __init__(self):
        pass

    var = bar_for_foo_mixin()
    var.bar(10)


class myfoo(bar_for_foo_mixin):
    def __init__(self):
        super(myfoo, self).__init__()

    def hello(self):
        print("hello", self.z)

final = myfoo()
final.hello()

Это выводит:

hello 20
1 голос
/ 15 марта 2019

Вы даже не вызываете метод bar с помощью новой переменной final:

class bar_for_foo_mixin():
    def __init__(self):
        self.z = 0

    def bar(self, q):
        x = 2
        y = 8
        self.z = x + y + q

class myfoo(bar_for_foo_mixin):
    def __init__(self):
        super(myfoo, self).__init__()

    def hello(self):
        print("hello", self.z)

final = myfoo()
final.bar(10) # <== call it to take effect
final.hello() # ==> hello 20
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...