我有一个名为IDataStream的抽象类,它有一个方法。我为这个名为IMUDataStream的抽象类GPSDataStream创建了两个实现。将来,我可能会添加IDataStream抽象类的另一个实现。我有另一个名为DataVisualizer的类,它可视化由不同DataStream类提取的所有数据。
将来,如果我添加IDataStream抽象类的另一个DataStream实现,就不应该修改DataVisualizer类来可视化数据。有没有一种方法可以创建IDataStream类的所有派生类的对象,将其添加到列表中,遍历列表,并使用它来调用将提供数据的方法?
请注意,我是python和设计模式的新手。试着学习。这可能是一个完全愚蠢的问题和完全疯狂的问题。实际上我对此有一个要求。如果这可以通过设计模式来实现,我请求读者给我指出材料。非常感谢您的帮助。谢谢!
#!/usr/bin/env python3
from abc import ABC, abstractmethod
class IDataStream(ABC):
def get_data(self):
pass
class IMUDataStream(IDataStream):
def __init__(self):
self.__text = "this is IMU data"
def get_data(self):
print(self.__text)
class GPSDataStream(IDataStream):
def __init__(self):
self.__text = "this is GPS data"
def get_data(self):
print(self.__text)
class DataVisualizer:
def __init__(self):
# somehow create objects of all derived classes of IDataStream here and call the get_data() function
# even if I add another derived class in the future. I should not be modifying the code here发布于 2020-02-22 07:49:33
您所要求的是能够找到内存中的所有实例化对象,然后只为特定的类/子类/父类/其他类过滤它们,看看这个关于如何从内存中获取所有当前对象和方法的stack-overflow question。
也就是说..。任何时候,当你不得不问自己如何在内存中全局地找到某个东西的所有实例时,你都应该停下来问一问(看起来你做到了,所以值得称赞)有没有更好/更容易的方法?
大多数时候,你会想让一个数据可视化工具独立,这样它只消耗数据流(这是在构造过程中指定的),如下所示:
ds = myDataStream()
vis = myDataVisualizer(ds)
vis.show() # or whatever或
ds = myDataStream()
vis = myDataVisualizer()
vis.show(ds)如果你想让你的数据可视化工具在运行时是数据不可知的(比如拥有来自多个源的数据),那么你有两个选择。添加用于删除和添加数据源的方法,或者,您可以使用类似于生产者-消费者模式的Queues and Processes将它们链接在一起(这就是我要做的)。
但是,如果你真的必须完全管理你自己的内存(比如通过一个映射,或者堆,或者其他任何东西)。然后有一些设计模式可以帮助你:
上的目录
发布于 2020-03-13 05:10:08
首先,您可能希望get_data方法返回数据而不是打印数据(否则它将自己进行可视化)。这可能会做你想要的。下面的代码将找出IDataStream的所有子类,如果类不是抽象类,则实例化该类的实例,在实例上调用方法get_data并将返回值附加到list中
#!/usr/bin/env python3
from abc import ABC, abstractmethod
class IDataStream(ABC):
@abstractmethod # you probably ment to add this
def get_data(self):
pass
class IMUDataStream(IDataStream):
def __init__(self):
self.__text = "this is IMU data"
def get_data(self):
return self.__text
class GPSDataStream(IDataStream):
def __init__(self):
self.__text = "this is GPS data"
def get_data(self):
return self.__text
def is_abstract(cls):
return bool(getattr(cls, "__abstractmethods__", False))
def get_all_non_abstract_subclasses(cls):
all_subclasses = []
for subclass in cls.__subclasses__():
if not is_abstract(subclass):
all_subclasses.append(subclass)
all_subclasses.extend(get_all_non_abstract_subclasses(subclass))
return all_subclasses
class DataVisualizer:
def __init__(self):
data = [cls().get_data() for cls in get_all_non_abstract_subclasses(IDataStream)]
print(data)
dv = DataVisualizer()打印:
['this is IMU data', 'this is GPS data']https://stackoverflow.com/questions/60347446
复制相似问题