【问题标题】:Importing Module, Function, Instance导入模块、函数、实例
【发布时间】:2014-04-11 23:33:28
【问题描述】:

我一直在进行一些测试以了解导入的工作原理:

文件1:

class Player():

    hp=0

    def __init__(self):
        self.hp=0

    zim = Player()
    zim.hp = 5

文件2:

import test1

print(test1.zim.hp)

我运行 file2: 并得到 5 的输出。(胜利的波浪旗)

太好了,那我把file1改成这样:

def Test():
    class Player():
        hp=0

        def __init__(self):
            self.hp=0

    zim = Player()
    zim.hp = 5

我一直在尝试修改 file2 中的代码以获得 5 的输出,但它失败了。有没有办法导入一个函数,然后是实例特定的数据(在这个例子中是 hp)?我知道'return',但想知道是否有办法修改以下代码以直接导入我需要的实例。

ie: abc 会是……???哎哟

import test1

print(abc.test1.zim.hp) 

~T

【问题讨论】:

  • 导入test1,test1是什么?
  • 为什么要修改 test1 文件以将所有内容都包装在 Test() 函数中?当它以前工作时,你试图通过这样做来实现什么?
  • 没有zim 对象。除非您显式调用它,否则函数体甚至不会执行,当您这样做时,您仍然无法进入函数内部并拉出它的胆量,除非该函数显式使用 return 之类的东西使它们可用。
  • 在您的第一个版本的 file1 中,两个 zim 行在您的对象定义中。在您的第二个版本中,它们被定义为 Test() 函数的一部分,而不是对象。这可能是你的问题吗?
  • 我认为 file1 的原始版本没有正确写在这里 - 基于评论“我运行 file2:并得到 5.(胜利的波浪标志)的输出”,我认为file1 的最后 2 行 必须 在最外层范围内。

标签: python import importerror


【解决方案1】:

回答您的问题“我想知道是否有办法修改以下代码以直接导入我需要的实例”:没有。

正如您无法进入一个函数并在模块中获取其内部工作原理一样,您也无法在导入中这样做。

该函数定义了 Player 是什么,对其进行了实例化,并调用了它的一个属性。然后函数结束,程序不知道Player是什么,更不用说zim是什么,它的hp属性是什么!

【讨论】:

    【解决方案2】:

    在你的test1 你有:

    class Player():
        hp=0
        def __init__(self):
            self.hp=0
        zim = Player()
        zim.hp = 5
    

    这将引发NameError: name 'Player' is not defined,因为您正在创建Player 的实例,而它的类定义尚未结束。我想你打算这样做:

    class Player():
        hp=0
        def __init__(self):
            self.hp=0
    zim = Player()    # This and the next line are indented differently
    zim.hp = 5
    

    在这种情况下,zim 成为test1 的模块变量,因此可以从test2 打印zim.hp

    现在,在您将test1 编辑为:

    def Test():
        class Player():
            hp=0
    
            def __init__(self):
                self.hp=0
    
        zim = Player()
        zim.hp = 5
    

    Player 对象实例化在它的类声明之外,所以它是正确的。但是变量zim 只存在于函数Test() 中。当您从另一个模块打印zim.hp 时,zim 不作为要从test2 访问的模块变量存在。

    也许你可以通过Test() 方法return zim.hp。如果这样做,您可以从test2 访问值作为print(test1.Test())

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-24
      • 2022-11-11
      • 2020-06-04
      • 2018-01-16
      • 2020-06-18
      • 2021-12-20
      • 2016-12-15
      • 1970-01-01
      相关资源
      最近更新 更多