Как сделать локальную переменную метода суперкласса доступной для подкласса, в котором суперкласс вызывается другим классом

#python #oop #inheritance

#python #ооп #наследование

Вопрос:

Как вы можете видеть код, у меня есть суперкласс 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
  

Ответ №1:

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. Поэтому мне нужно сделать это как classmethod. Спасибо @blhsing

Ответ №2:

Вы даже не вызываете 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
  

Комментарии:

1. Я новичок в этом ООП, есть ли способ, которым я могу вызвать метод bar в oldfoo(): class с аргументом 10 и вычислить z, сохранить его в переменной и передать сохраненное значение в подкласс myfoo():

2. Методы @VamsiNimmala вызываются для каждого объекта, z атрибут будет разным для каждого экземпляра, например: создание экземпляров a = myfoo() , b = myfoo() и c = myfoo() , затем вызов bar каждого a.bar(10); b.bar(20); c.bar(30) (с разными значениями), затем вызов hello метода покажет, что каждый из них имеет разное значение для z атрибута: a.hello(); b.hello(); c.hello() приводит к hello 20 , hello 30 и hello 40 .