【问题标题】:How to call an object created in a module如何调用在模块中创建的对象
【发布时间】:2012-03-21 16:11:57
【问题描述】:

我对 Python 中的类有疑问。 我想知道如何调用在其他python程序的模块中创建的对象。

让我举个例子。我在“class_module.py”文件中有这些对象

def objectCase():
    object1 = class_name("object1")
    object2 = class_name("object2")
    object3 = class_name("object3")

def other_objectCase():
    other_object1 = class_name("other_object1")
    other_object2 = class_name("other_object2")
    other_object3 = class_name("other_object3")

对于from class_module.py import *,我想如果我使用objectCase() 函数,我的程序中有这些对象(object1, object2, object3),如果我使用otherobjectCase() 函数,我会调用所有otherobject。 但是这是错误的。 有什么问题?

【问题讨论】:

    标签: python class object module


    【解决方案1】:

    您正在函数内部创建局部变量。一旦函数返回,它们就会丢失。如果您以后需要这些对象,请return 将它们发送给调用者

    return object1, object2, object3
    

    并在调用代码中将名称绑定到它们

    a, b, c = objectCase()
    

    【讨论】:

    • 我怎样才能在函数中自动保持相同的名称(所以“object1”、“object2”而不是“a”、“b”)?
    • @SniperWolf:基本上没有。
    【解决方案2】:

    查看Scopes and Namespaces 的文档,名称object1object2object3objectCase() 函数的本地名称,因此您将无法从主模块访问它们因为你的代码是当前编写的。

    完成你想要的最典型的方法是返回这些变量:

    def objectCase():
        object1 = class_name("object1")
        object2 = class_name("object2")
        object3 = class_name("object3")
        return object1, object2, object3
    

    然后当您调用它时,将返回的值分配回相同的名称:

    object1, object2, object3 = objectCase()
    

    没有一种自动保持与局部变量相同名称的好方法,但在这里返回字典可能是合适的。您可以返回{'object1': object1, 'object2': object2, 'object3': object3},而不是返回object1, object2, object3,然后调用函数可以执行以下操作:

    result = objectCase()
    # do something with result['object1'], result['object2'], or result['object3']
    

    【讨论】:

    • 我有同样的问题阅读这个答案。如何自动在函数中保持相同的名称(所以“object1”、“object2”而不是“a”、“b”)?
    【解决方案3】:

    如果您希望 object1, ... 位于模块的命名空间中,您有多种选择:

    object1, object2, object3 = objectCase()
    

    或者,如果你不想处理那里的赋值,你可以在函数中使用global关键字:

    def objectCase():
        global object1, object2, object3
        object1 = class_name("object1")
        object2 = class_name("object2")
        object3 = class_name("object3")
    

    或者,您可以完全跳过该函数,并将其作为顶级代码:

    object1 = class_name("object1")
    object2 = class_name("object2")
    object3 = class_name("object3")
    

    【讨论】:

    • global 在这里实际上不起作用,因为这个函数是从另一个模块导入的,全局变量是模块的全局变量,而不是跨模块。
    • global 将使对象在创建它们的模块中成为全局对象,然后from module import * 将能够获取它们。
    • 没错,但是每次从module 调用更新全局变量的函数时都执行from module import * 将是一个非常混乱的程序结构。
    • @F.J,使用global 很麻烦;)。在重新阅读他的问题时,我认为您和 Sven 对他的问题有正确的解释——我认为他希望他的对象在他定义函数的模块中。
    猜你喜欢
    • 1970-01-01
    • 2017-04-07
    • 2017-01-09
    • 2021-11-17
    • 1970-01-01
    • 2011-05-20
    • 2017-06-14
    • 2021-09-21
    • 1970-01-01
    相关资源
    最近更新 更多