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

2024-09-30 16:22:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在python的一个项目中工作,在这个项目中,我有一个GUI,我把一堆工作分散在类之间。我不知道很多在类之间传递数据的最佳实践,我经常遇到这样的问题:我必须实现某些东西,或者为了工作而更改某些东西,我不得不使用另一个类的许多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

我经常发现自己在做类似上面的事情,把对象交给classWindow 或者简单地继承它们的一切,比如ParseMyWork

必须有更好、更干净的方法来传递数据,而不是让我的类完全依赖于彼此,在这种情况下,一个小小的改变就会产生一个级联效应,迫使我在其他一些类中进行更改。在

问题的任何答案都不一定要使用python,但如果答案是


Tags: 数据项目对象答案selfnoneinitdef
3条回答

如果我没弄错你的问题,我会说在你的情况下继承是不必要的。为什么不给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

然后你可以像这样使用函数

^{pr2}$

这样,您就可以在任何窗口实例中使用work_nuparse实例。在

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

类是超级强大的,所以很高兴你开始使用em

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

现在进入你的问题:

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

现在,当创建一个类时,重要的是要在其中存储一些属性,一旦类被实例化,就要检索这些属性。在

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

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

现在,与窗口类关联的解析信息永远是任何窗口类实例的一部分。现在,下一步是创建一个用于解析的get方法。应按如下方式进行:

^{pr2}$

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

因此,假设您在自己的文件中拥有与窗口类关联的所有内容(假设文件名被调用窗口.py). 在一个单独的文件中(我们称之为主.py),可以执行以下操作:

    import Window

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

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

现在,作为一个补充说明,我相信可以通过简单地执行以下操作来获取与类实例的属性相关的信息

     windowResolution = windowInstance.resolution

但总的来说,这是不好的做法。简而言之,原因是你现在公开了你不想公开的类的属性名,因为这使得代码之外的人很容易知道保存信息的名称并进行更改。当涉及到使整个程序正常工作时,这可能会导致无数其他问题。这就是为什么使用getter和setter是最佳实践。我已经展示了什么是吸气剂。只是一个获取属性的方法。您可以假设,setter允许将属性的信息设置为其他属性。现在你可能会说“Gabe,如果我们可以创建setter方法,如果他们只是改变了它有什么意义”。我的答案是不给所有属性一个setter方法。对于你不介意别人改变的属性,给它一个setter方法,但是对于你不想让任何外部用户接触的属性,只需不要为它创建setter方法。getter方法也是如此。用户不需要查看使程序工作的所有属性的所有信息。这里有一个更好的解释:https://en.wikipedia.org/wiki/Mutator_method

现在,回到你的例子。现在让我们假设你有你的ParseMyWork类在它自己的文件中,就像我们对你的窗口类所做的那样,假设ParseMyWork需要来自Window类的解析信息。您可以执行以下操作:

    import Window
    import ParseMyWork

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

    parseInstance = ParseMyWork(windowResolution)

这将只传递与窗口类关联的窗口解析信息。希望这有帮助。在

留着吧简单.py公司名称:

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

def parseStuff(stuff):
    pass

在真的吗公司名称:

^{pr2}$

不要让课程复杂化:

from really import really_simple
really_simple(window)

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

相关问题 更多 >