保持 类 松散耦合并共享数据

Keeping classes loosely coupled and sharing data

我一直在 python 的一个项目中工作,我有一个 GUI,我在 class 之间拆分了一堆工作。我不知道很多在 class 之间传递数据的最佳实践,而且我经常 运行 进入这个问题,我必须实施一些东西,或者为了工作而改变一些东西,我已经使用了另一个 class 的很多 classes 对象来为它提供我需要的数据。

对于如何保持我的 classes 独立以供以后修改并仍然传递相关数据而不会对接口造成太大影响的任何想法或建议将不胜感激?

举个例子

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

我经常发现自己在做类似上面的事情,将对象提供给 class Window 或者像 ParseMyWork

那样简单地继承它们的所有内容

必须有更好更简洁的方法来传递数据,而不会使我的 class 完全依赖彼此,其中一个小的变化会产生级联效应,迫使我对其他一些 [= =34=]es.

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

将会有所帮助

如果我对你的问题的理解是正确的,我会说你的情况不需要继承。为什么不给 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 实例与任何 window 实例一起使用。

提前为我的 Python 道歉,已经有一段时间了,所以如果您发现任何菜鸟错误,请指出。

保留 simple.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)

不要使 class 复杂化:

from really import really_simple
really_simple(window)

imo:classes 是过于复杂的对象,在很多情况下比它们需要的更令人困惑,而且它们包含引用和修改内容,一旦它们被分离就很难解耦与其他 classes 相关联。如果没有明确的理由说明为什么需要使用 class,那么可能不需要使用它。

类 非常强大,所以你开始使用 em 是件好事。

Discalimer:python 已经有一段时间没有工作了,所以事情可能不准确。不过,总体思路仍然适用。

现在进入你的问题:

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

现在,在创建 class 时,重要的是您要在其中存储要在 class 实例化后检索的属性。

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

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

现在,与您的 Window class 关联的分辨率信息永远是任何 Window class 实例的一部分。现在,下一步是创建一个用于解析的 get 方法。这应该按以下方式完成:

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

      def getResoultion():
         return self.resolution

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

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

    import Window

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

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

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

之类的操作来获取与具有 class 实例的属性相关联的信息
     windowResolution = windowInstance.resolution

但这通常是不好的做法。简而言之,原因是因为您现在公开了您不想做的 class 的属性名称,因为它使代码之外的人很容易了解保存该信息的名称并改变它。当涉及到使整个程序正常工作时,这可能会导致无数其他问题。这就是为什么最好使用 getters 和 setters 的原因。我已经展示了 getter 是什么。只是一个获取属性的方法。正如您可能假设的那样,Setter 允许将属性的信息设置为其他内容。现在你可能会说 "Gabe, if we can create setter methods, what's the point of it if they just change it"。我对此的回答是不要为所有属性提供 setter 方法。对于你不介意一个人改变的属性,给它一个 setter 方法,但是对于你不希望任何外部用户接触的属性,根本就不要为它创建一个 setter 方法. getter 方法也一样。用户不需要查看使您的程序运行的所有属性的所有信息。这里有一个更好的解释:https://en.wikipedia.org/wiki/Mutator_method

现在,回到你的例子。现在假设您的 ParseMyWork class 像我们对您的 Window class 所做的那样在其自己的文件中,并且假设 ParseMyWork 需要来自 Window [=48] 的分辨率信息=].您可以执行以下操作:

    import Window
    import ParseMyWork

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

    parseInstance = ParseMyWork(windowResolution)

这只会传递与您的 Window class 关联的 window 分辨率信息。希望这有帮助。