gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 12:34:48 25 4
gpt4 key购买 nike

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

#!/usr/bin/python

class test:
from platform import system
is_linux(self):
system = system()
if system == "Linux": return True

一个更好的例子:

#!/usr/bin/python

# Add ANSI colour strings
class stdout:
from sys import stdout
def message(message, self): stdout.write(message)

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

最佳答案

嗯,事情没那么简单。实际上,import 语句在很多方面看起来都像是直接定义某些东西来代替它。如果你写

class test:
from platform import system

看起来很像

class test:
def system():
# ....

然后你有以下问题:

  1. 你不能只使用 system() 因为 system 不在全局范围内
  2. 你不能使用 self.system() 因为在这种形式下,python 自动传递 self 作为第一个参数,但是 system() 没有参数,你会得到 TypeError: system() 不接受任何参数(给定 1 个)
  3. 你不能使用 test.system() 因为 system() 看起来像一个普通的方法,你会得到 TypeError: unbound method system() must be called with test instance as first argument (got nothing相反)

有几种方法可以解决这些问题:

  1. import platform 放在顶层,并在任何需要的地方使用 platform.system(),从而解决上一个问题 #1。列表
  2. 使用 staticmethod 装饰器,修复上一个问题 #2 和 #3。列表。

喜欢

class test:
from platform import system
system = staticmethod(system)

然后你可以使用 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])

在此示例中,移动 from sys import argv 是有效的,因为只有在运行脚本时才需要它。但是当你把它作为一个导入模块使用时,就没有必要在这个导入中了。但这不是你的情况,因为在你的情况下,测试类总是需要 system() ,所以没有理由从顶层移动这个导入。把它留在那里,没关系。

关于Python:在函数中使用在类内部完成的导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6883319/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com