方法在使用多重继承时不被重写



基于我之前的问题,我现在正在尝试实现我得到的答案。然而,现在我面临的另一个问题涉及(我认为(多重继承。

基本上,我的主类有一个Interpolator,它有几个属性。其中一个具有用子类定义的子属性,我无法覆盖其中的方法。请帮忙吗?

import numpy as np
class MyClass:
def __init__(self):
self._time = np.array([0, 1, 2, 3])
self._a = np.array([0, 1, 2, 3])
self._sub = SubClass()
def _get_class_value(self, name):
value = getattr(self, '_'+name)
return value
@property
def time(self):
return self._get_class_value('time')
@property
def a(self):
print('calling a')
return self._get_class_value('a')
@property
def sub(self):
print('calling sub')
return self._sub

class SubClass:
def __init__(self):
self._k1 = np.array([0, 1, 2, 3])
def _get_sub_value(self, name):
value = getattr(self, '_'+name)
return value
@property
def k1(self):
print('calling k1')
return self._get_sub_value('k1')

class Interpolator(MyClass, SubClass):
def __init__(self, vector):
super().__init__()
self._vector = np.array(vector)
def _get_class_value(self, name):
print('overriding main class', name)
return self._interpolate(name)
def _get_sub_value(self, name):
print('overriding sub class', name)
return self._interpolate(name)
def _interpolate(self, name):
value = getattr(self, '_'+name)
return np.interp(self._vector, self._time, value)
interp = Interpolator([1.5, 2.5])
value_a = interp.a
value_k1 = interp.sub.k1

运行上面的代码,我从来没有得到'overriding sub class':

calling a
overriding main class a
calling sub
calling k1

class MyClass init self_sub=SubClass((将是一个新的类。

你使用自我_sub=SubClass((

结果将是类SubClass _get_sub_value。

类插值器_get_sub_value将不会被使用。

import numpy as np

class MyClass:
def __init__(self):
self._time = np.array([0, 1, 2, 3])
self._a = np.array([0, 1, 2, 3])
# self._sub = SubClass()  # delete
def _get_class_value(self, name):
value = getattr(self, '_' + name)
return value
@property
def time(self):
return self._get_class_value('time')
@property
def a(self):
print('calling a')
return self._get_class_value('a')
@property
def sub(self):
print('calling sub')
return self  # return self

class SubClass:
def __init__(self):
self._k1 = np.array([0, 1, 2, 3])
def _get_sub_value(self, name):
value = getattr(self, '_' + name)
return value
@property
def k1(self):
print('calling k1')
return self._get_sub_value('k1')

class Interpolator(MyClass, SubClass):
def __init__(self, vector):
MyClass.__init__(self)  # Inheritance
SubClass.__init__(self)  # Inheritance
self._vector = np.array(vector)
def _get_class_value(self, name):
print('overriding main class', name)
return self._interpolate(name)
def _get_sub_value(self, name):
print('overriding sub class', name)
return self._interpolate(name)
def _interpolate(self, name):
value = getattr(self, '_' + name)
return np.interp(self._vector, self._time, value)
return np.interp(self._vector, self._time, value)

interp = Interpolator([1.5, 2.5])
value_a = interp.a
value_k1 = interp.sub.k1

最新更新