Python 保持类松散耦合并共享数据
我一直在用python进行一个项目,在这个项目中我有一个GUI,我在类之间划分了一系列工作。我不知道很多在类之间传递数据的最佳实践,我经常遇到这样的问题,我必须实现一些东西,或者为了工作而更改一些东西,我求助于使另一个类的很多类成为对象,以便为它提供我需要的数据 对于如何保持我的类独立于以后的修改,并且在不太影响接口的情况下传递相关数据,如果您有任何想法或建议,我们将不胜感激 例如Python 保持类松散耦合并共享数据,python,class,loose-coupling,Python,Class,Loose Coupling,我一直在用python进行一个项目,在这个项目中我有一个GUI,我在类之间划分了一系列工作。我不知道很多在类之间传递数据的最佳实践,我经常遇到这样的问题,我必须实现一些东西,或者为了工作而更改一些东西,我求助于使另一个类的很多类成为对象,以便为它提供我需要的数据 对于如何保持我的类独立于以后的修改,并且在不太影响接口的情况下传递相关数据,如果您有任何想法或建议,我们将不胜感激 例如 class Window(): def __init__(self, parent=None):
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
我经常发现自己在做上面的事情,比如给类窗口提供对象
或者像ParseMyWork那样简单地继承他们的一切
必须有更好、更干净的方法来传递数据,而不会使我的类彼此完全依赖,一个小小的更改就会产生级联效应,迫使我在一堆其他类中进行更改
这个问题的任何答案都不一定要用python,但是如果它们是的话,这会很有帮助。如果我正确理解了您的问题,我会说在您的情况下继承是不必要的。为什么不给
ParseMyWork
一个函数来处理特定的窗口
任务
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():
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道歉,已经有一段时间了,如果你看到新手犯的错误,一定要指出。保持简单。py:
def doStuff(window):
#do work here
return window
def parseStuff(stuff):
pass
真的吗
from simple import doStuff, parseStuff
def really_simple(window):
okay = doStuff(window)
return parseStuff(okay)
不要让课堂变得复杂:
from really import really_simple
really_simple(window)
imo:类是过于复杂的对象,在很多情况下比它们需要的更容易混淆,而且它们包含引用和修改内容,一旦它们与其他类绑定,就很难解耦。如果没有明确的理由来解释为什么需要使用类,那么它可能就不需要使用了。类功能非常强大,所以您最好开始使用它们 Discalimer:已经有一段时间没有使用python了,所以事情可能不太准确。不过,总的想法仍然适用 现在进入你的问题: 我想说实现您想要的最好方法是创建第一个对象的实例,从中提取信息 现在,在创建一个类时,重要的是,在类中有一些属性,这些属性将存储在类中,一旦类被实例化,您就可以检索这些属性 例如,使用上面的窗口类示例,假设您有一个名为resolution的属性。它看起来像这样:
class Window():
def __init__(self, parent = None):
self.parent = None
self.resolution = '40x80'
现在,与窗口类关联的分辨率信息永远是任何窗口类实例的一部分。现在,下一步将是创建用于解析的get方法。应按照以下步骤进行:
class Window():
def __init__(self, parent = None):
self.parent = None
self.resolution = '40x80'
def getResoultion():
return self.resolution
现在,我们创建这个get方法的原因是,我们现在可以为随它返回的信息设置一个变量
因此,假设您在自己的文件中拥有与窗口类关联的所有内容(假设文件名为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方法也是如此。用户不需要查看使程序工作的所有属性的所有信息。这里有一个更好的解释:
现在,回到你的例子。现在让我们假设您的ParseMyWork类在它自己的文件中,就像我们对您的Window类所做的那样,并且让我们假设ParseMyWork需要来自Window类的解析信息。您可以执行以下操作:
import Window
import ParseMyWork
windowInstance = Window()
windowResolution = windowInstance.getResolution()
parseInstance = ParseMyWork(windowResolution)
这将只传递与窗口类关联的窗口分辨率信息。希望这能有所帮助。实际上,我没有考虑过将类直接传递给函数,并在没有外部引用的情况下处理它。就我的目的而言,这可能是可行的。是的,我认为函数将是这里的诀窍。知道何时使用继承可能很棘手,但我认为在您的情况下,两个编写良好的函数就可以了,这样您就不必担心更改基类时的级联效应。如果你有一个特定的问题,或者有更多的示例代码,我很乐意把它写进我的答案中,这样就可以了。我有很多代码可以把它浓缩成一个简单的例子。我以前从来没有在类中实际使用过get和set方法,因为我从来没有想过它们有多大用处。我仍然对它们的用途有点怀疑,尽管我现在正在接近它们。它将使修改名称和数据类型成为可能