保持课程松散耦合并共享数据

时间:2017-06-07 20:49:29

标签: python class loose-coupling

我已经在python上工作了一个项目,我有一个GUI,我分开了一堆类之间的工作。我不太了解在课间传递数据的许多最佳实践,而且我经常遇到这个问题,我必须实现某些功能,或者为了工作而改变某些东西,而且我也是如此。为了给它提供我需要的数据,他们使用了另一个类的很多类对象。

对于如何保持我的类独立以便以后修改并仍然传递相关数据而不会过多地影响接口,我们将非常感激任何想法或建议吗?

举个例子

class Window():
    def __init__(self, parent=None):
        self.parent = parent
    def doStuff(self):
        #do work here

class ParseMyWork(Window):
    def __init__(self, parent=None):
        self.parent=parent

我经常发现自己正在做类似于上面给类 Window 的对象 或者简单地从 ParseMyWork

中继承它们中的所有内容

必须有更好,更清晰的方式传递数据,而不会让我的课程完全依赖于彼此,其中一个小的改变创造了一个级联效应,迫使我在一堆其他类中进行更改。

问题的任何答案都不一定必须在python中,但如果它们是

将会有所帮助

3 个答案:

答案 0 :(得分:1)

如果我正确理解你的问题,我会说在你的情况下不需要继承。为什么不给ParseMyWork一个处理特定Window任务的函数?

class Window():
  def __init__(self, parent=None):
    self.parent = parent

  def doStuff(self):
    #do work here

class ParseMyWork():
  def __init__(self, parent=None):
    self.parent=parent`

  def doWindowActivity(self, window):
    window.doStuff

然后你可以使用像这样的功能

    work_parser = ParseMyWork()
    window = Window()
    work_parser.doWindowActivity(window);

通过这种方式,您可以将work_parse实例与任何窗口实例一起使用。

为我的Python提前道歉,已经有一段时间了,所以如果你看到任何新手的错误,请指出它们。

答案 1 :(得分:1)

保持简单.py:

def doStuff(window):
    #do work here
    return window

def parseStuff(stuff):
    pass

really.py:

from simple import doStuff, parseStuff

def really_simple(window):
    okay = doStuff(window)
    return parseStuff(okay)

不要使班级复杂化:

from really import really_simple
really_simple(window)

imo:类是过于复杂的对象,并且在很多情况下比它们需要的更令人困惑,加上它们包含引用和修改内容,并且一旦它们与其他类绑定就很难解耦。如果没有明确的理由需要使用某个类,那么可能不需要使用它。

答案 2 :(得分:1)

课程非常强大,所以你开始使用em很好。

Discalimer:现在还没有在python中工作过一段时间,所以事情可能并不准确。一般的想法仍然适用。

现在进入你的问题:

我想说实现你想要的最好方法是创建第一个从中提取信息的对象的实例。

现在,在创建类时,至关重要的是,在实例化类之后,您希望在其中存储您希望检索的属性。

例如,使用上面的Window类示例,假设您有一个名为resolution的属性。它看起来像这样:

    class Window():
      def __init__(self, parent = None):
         self.parent = None
         self.resolution = '40x80'

现在,与Window类关联的解析信息永远是任何Window类实例的一部分。现在,下一步将是创建一个解析的get方法。这应该按如下方式完成:

    class Window():
      def __init__(self, parent = None):
         self.parent = None
         self.resolution = '40x80'

      def getResoultion():
         return self.resolution

现在,我们创建此get方法的原因是因为我们现在可以将变量设置为随其返回的信息。

因此,假设您在自己的文件中拥有与Window类相关的所有内容(假设文件名称为Window.py)。在一个单独的文件中(我们称之为main.py),您可以执行以下操作:

    import Window

    windowInstance = Window()
    windowResolution = windowInstance.getResolution()

如果打印出变量windowResolution,则应该打印出40x80。

现在,作为旁注,我确实可以通过简单地执行类似

的操作来获取与属性相关联的信息。
     windowResolution = windowInstance.resolution

但总的来说这是不好的做法。简而言之,原因是因为您现在公开了您不希望执行的类的属性名称,因为它使代码之外的人可以轻松地了解保存该信息的名称并对其进行更改。在整体计划工作方面,这可能会导致无数其他问题。这就是使用getter和setter的最佳做法。我已经展示了吸气剂是什么。简单地说就是属性的get方法。您可以假设,Setter允许将属性的信息设置为其他内容。现在你可能会说“Gabe,如果我们可以创建setter方法,那么只要它们改变它就有什么意义”。我的答案是不给所有属性设置setter方法。对于你不介意改变的属性,给它一个setter方法,但对于你不希望任何外部用户触摸的属性,只是不为它创建一个setter方法。 getter方法也是如此。用户无需查看使程序正常工作的所有属性的所有信息。这是一个更好的解释:https://en.wikipedia.org/wiki/Mutator_method

现在,回到你的例子。现在假设您将ParseMyWork类放在自己的文件中,就像我们使用Window类一样,让我们​​说ParseMyWork需要Window类的解析信息。您可以执行以下操作:

    import Window
    import ParseMyWork

    windowInstance = Window()
    windowResolution = windowInstance.getResolution()

    parseInstance = ParseMyWork(windowResolution)

这只会传递与Window类关联的窗口分辨率信息。希望这会有所帮助。