#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
.