Python:在函数中使用类内部导入

Jor*_*ell 3 python python-import

任何人都可以解释如何使以下示例工作?由于类中的几个函数将使用平台中的相同函数,我认为最好在类内部导入它,但我不知道如何在函数内部使用它(因为我经常出错关于它).

#!/usr/bin/python

class test:
   from platform import system
   is_linux(self):
      system = system()
      if system == "Linux": return True
Run Code Online (Sandbox Code Playgroud)

一个更好的例子:

#!/usr/bin/python

# Add ANSI colour strings
class stdout:
    from sys import stdout
    def message(message, self):  stdout.write(message)
Run Code Online (Sandbox Code Playgroud)

注意:这只是一个片段,有一些部分缺失,但我的意思是一个例子.
我知道我可能只是移动system = system()并使用self.system但也许更好的方法?

Ale*_*kin 8

嗯,事情并非那么简单.实际上,import语句在很多方面看起来像直接定义某些东西而不是它.如果你写

class test:
    from platform import system
Run Code Online (Sandbox Code Playgroud)

它看起来很像

class test:
    def system():
        # ....
Run Code Online (Sandbox Code Playgroud)

然后你有以下问题:

  1. 你不能只使用system(),因为系统不在全球范围内
  2. 你不能使用self.system(),因为在这种形式,python自动self作为第一个参数传递,但system()没有参数,你会得到TypeError: system() takes no arguments (1 given)
  3. 你不能使用test.system()因为system()看起来像一个普通的方法,你会得到 TypeError: unbound method system() must be called with test instance as first argument (got nothing instead)

围绕这些问题有几种方法:

  1. 放在import platform顶层,并在任何地方使用platform.system(),从而解决prev的问题#1.名单
  2. 使用staticmethod装饰,修复prev的#2和#3.名单.

喜欢

class test:
    from platform import system
    system = staticmethod(system)
Run Code Online (Sandbox Code Playgroud)

那么你可以使用self.system()或test.system()

实际上,你应该只是将所有内容导入到顶层而忘记它.如果您需要特殊的运行方式,则只需拆分导入声明.喜欢

import foo
import bar

def fun(param1, param2):
    # .....

if __name__ == '__main__':
    from sys import argv
    if len(argv) > 2:
        fun(argv[1], argv[2])
Run Code Online (Sandbox Code Playgroud)

在此示例中,移动from sys import argv有效,因为仅在运行脚本时才需要移动.但是当您将其用作导入模块时,此导入中不需要它.但这不是你的情况,因为在你的情况下,测试类总是需要system(),所以没有理由将这个导入从顶层移动.只要留在那里,不要介意.