首页 > 解决方案 > 如何在模块和类之间共享方法和数据?

问题描述

我需要一些关于模块和类以及如何共享数据和方法的帮助。

我一直在研究一个 Python 程序,但它已经变得太大而无法以不使用类的原始形式处理。该程序长约 6000 行,并使用具有多个屏幕的Tkinter 。我认为逻辑分解为类将遵循用户界面,每个屏幕都是它自己的类。然后我会有另一个类来存储所有“全局”数据。

到目前为止,所有内容仍在一个文件中,并且正在运行。但是,我现在正试图通过将这些类保存在自己的文件中来将它们分解为单独的模块。这就是事情对我来说非常糟糕的地方。我已经阅读了许多关于课程的教程和文本,并且在 Stack Overflow 上看到了许多关于我的相同问题的帖子,但我仍然不知道该怎么做。

由于我的实际程序很大,我创建了一个非常简单的程序来显示我需要做什么......


    #main.py


    class data:
        def __init__(self):
            self.A = "A"
            self.B = "B"
            self.C = "C"
            self.All = ""


    class module_1:
        def __init__(self):
            place_holder = "something"

        def add_1_2(self):
            d.All = d.A + d.B
            print("new_string=", d.All)


    class module_2:
        def __init__(self):
            place_holder = "something"

        def combine_it_all(self):
            m1.add_1_2()
            d.All = d.All + d.C



    d = data()
    m1 = module_1()
    m2 = module_2()

    m2.combine_it_all()
    print("d.All = ", d.All)
    print("END OF PROGRAM")

上面的程序显示了我想如何访问其他类中的数据并使用它们的方法。但是,我还需要将程序分解为模块,以便它们更小且更易于使用。所以,我试图分解每个类并将其放入自己的文件(模块)中,现在我不知道如何访问来自模块的其他类中的数据或方法。以下是每个文件的细分...


    #data_p.py

    class data:
        def __init__(self):
            self.A = "A"
            self.B = "B"
            self.C = "C"
            self.All = ""

    #module_1_p.py

    class module_1:
        def __init__(self):
            place_holder = "something"

        def add_1_2(self):
            d.All = d.A + d.B
            print("new_string=", d.All)


    #module_2_p.py

    class module_2:
        def __init__(self):
            place_holder = "something"

        def combine_it_all(self):
            m1.add_1_2()
            d.All = d.All + d.C


    #main.py

    from data_p import data
    from module_1_p import module_1
    from module_2_p import module_2

    d = data()
    m1 = module_1()
    m2 = module_2()

    m2.combine_it_all()
    print("d.All = ", d.All)
    print("END OF PROGRAM")

如您所见,属性和方法存在问题,但尚未实例化。不幸的是,我多年来一直在上升,当然不是最聪明的程序员,但我希望有人能告诉我如何使这个简单的示例工作,以便我可以修复我的实际程序。

标签: pythonclass

解决方案


问题是类被实例化,但每个实例都不知道另一个,解决它的一种方法是在方法调用中传递引用。
在实际情况下可能会做得更好,但是通过这些更改,您的示例将起作用:

#module_1_p.py (line 5 changed)

class module_1:
    def __init__(self):
        place_holder = "something"

    def add_1_2(self, d):
        d.All = d.A + d.B
        print("new_string=", d.All)


#module_2_p.py (lines 5 and 6 changed)

class module_2:
    def __init__(self):
        place_holder = "something"

    def combine_it_all(self, m1, d):
        m1.add_1_2(d)
        d.All = d.All + d.C

#main.py (line 9 changed)
from data_p import data
from module_1_p import module_1
from module_2_p import module_2

d = data()
m1 = module_1()
m2 = module_2()

m2.combine_it_all(m1, d)
print("d.All = ", d.All)
print("END OF PROGRAM")

推荐阅读