基于我之前的问题,我现在正在尝试实现我得到的答案。然而,现在我面临的另一个问题涉及(我认为(多重继承。
基本上,我的主类有一个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