我有不同的类,我需要以几乎相同的方式部分初始化。 init函数接收输入文件路径和/或一些numpy数据。
class InertialData1:
def __init__(self, file=None, data=None):
# --- this is the (almost) common part ---
if file is None:
self.file = 'Unknown path to file'
else:
self.file = file
assert isinstance(self.file, str)
if data is None:
self.data = read_logfile(file, 'a_token')
else:
self.data = data
assert isinstance(self.data, np.ndarray)
# --- end of the common part ---
# Here other stuff different from class to class
read_logfile()函数(外部函数)中的标记也会从一个类更改为类。
class InertialData2:
def __init__(self, file=None, data=None):
# here the common code as above, but with 'another_token' instead of 'a_token'
# here other stuff
...
当然,在所有类定义中写相同的行是不行的。
可能的解决方案。
我想过定义像这样的外部函数
def initialize(file, data, token):
if file is None:
file = 'Unknown path to file'
else:
file = file
assert isinstance(file, str)
if data is None:
data = read_logfile(file, token)
else:
data = data
assert isinstance(data, np.ndarray)
return file, data
然后我可以在每个类的 init 方法中使用它,如下所示:
class InertialData1:
def __init__(self, file=None, data=None):
self.file = file
self.data = data
self.file, self.data = initialize(self.file, self.data, token='a_token')
这种方式似乎有效。我只是感觉这不是最好的方式,或者不是pythonic,我希望从你的答案中学到一些东西:) 感谢
答案 0 :(得分:1)
您应该能够通过使用类继承来干掉(不要重复自己)代码:
class InertialData:
def __init__(self, file=None, data=None):
# --- this is the common part ---
if file is None:
self.file = 'Unknown path to file'
else:
self.file = file
assert isinstance(self.file, str)
def init_data(self, token, data):
if data is None:
self.data = read_logfile(self.file, token)
else:
self.data = data
assert isinstance(self.data, np.ndarray)
class InertialData1(InertialData):
def __init__(self, file=None, data=None):
# --- this is the different part ---
super().__init__(file=file, data=data);
self.init_data('token_a', data)
请注意以下几点:
您可以制作具有重复功能的“通用”类InertialData。然后,所有自定义类都可以从常用类继承。了解课程InertialData1
如何将InertialData
作为参数?
在所有继承自InertialData
的类中,您可以调用super
,这将调用超类的__init__
方法,在本例中为InertialData
。< / p>
初始化具有每个类的不同标记的数据的代码位已被拉入一个将标记作为参数的函数。现在,您可以在任何继承自initialize_data('token_a')
的类的__init__
函数中调用InertialData
。
我将您的类重命名为以大写字母开头(就像Python的惯例一样)。