首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在基类中创建派生类的对象- python

在基类中创建派生类的对象- python
EN

Stack Overflow用户
提问于 2020-02-22 07:20:19
回答 2查看 56关注 0票数 2

我有一个名为IDataStream的抽象类,它有一个方法。我为这个名为IMUDataStream的抽象类GPSDataStream创建了两个实现。将来,我可能会添加IDataStream抽象类的另一个实现。我有另一个名为DataVisualizer的类,它可视化由不同DataStream类提取的所有数据。

将来,如果我添加IDataStream抽象类的另一个DataStream实现,就不应该修改DataVisualizer类来可视化数据。有没有一种方法可以创建IDataStream类的所有派生类的对象,将其添加到列表中,遍历列表,并使用它来调用将提供数据的方法?

请注意,我是python和设计模式的新手。试着学习。这可能是一个完全愚蠢的问题和完全疯狂的问题。实际上我对此有一个要求。如果这可以通过设计模式来实现,我请求读者给我指出材料。非常感谢您的帮助。谢谢!

代码语言:javascript
运行
复制
#!/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
EN

回答 2

Stack Overflow用户

发布于 2020-02-22 07:49:33

您所要求的是能够找到内存中的所有实例化对象,然后只为特定的类/子类/父类/其他类过滤它们,看看这个关于如何从内存中获取所有当前对象和方法的stack-overflow question

也就是说..。任何时候,当你不得不问自己如何在内存中全局地找到某个东西的所有实例时,你都应该停下来问一问(看起来你做到了,所以值得称赞)有没有更好/更容易的方法?

大多数时候,你会想让一个数据可视化工具独立,这样它只消耗数据流(这是在构造过程中指定的),如下所示:

代码语言:javascript
运行
复制
ds = myDataStream()

vis = myDataVisualizer(ds)
vis.show() # or whatever

代码语言:javascript
运行
复制
ds = myDataStream()

vis = myDataVisualizer()
vis.show(ds)

如果你想让你的数据可视化工具在运行时是数据不可知的(比如拥有来自多个源的数据),那么你有两个选择。添加用于删除和添加数据源的方法,或者,您可以使用类似于生产者-消费者模式的Queues and Processes将它们链接在一起(这就是我要做的)。

但是,如果你真的必须完全管理你自己的内存(比如通过一个映射,或者堆,或者其他任何东西)。然后有一些设计模式可以帮助你:

  • Factory
  • Abstract Factory
  • Decorator
  • Or也许是另外一个,看看refactoring.guru

上的目录

票数 0
EN

Stack Overflow用户

发布于 2020-03-13 05:10:08

首先,您可能希望get_data方法返回数据而不是打印数据(否则它将自己进行可视化)。这可能会做你想要的。下面的代码将找出IDataStream的所有子类,如果类不是抽象类,则实例化该类的实例,在实例上调用方法get_data并将返回值附加到list

代码语言:javascript
运行
复制
#!/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()

打印:

代码语言:javascript
运行
复制
['this is IMU data', 'this is GPS data']
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60347446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档