任何人都可以解释如何使以下示例工作?由于类中的几个函数将使用平台中的相同函数,我认为最好在类内部导入它,但我不知道如何在函数内部使用它(因为我经常出错关于它).
#!/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():
# ....
然后你有以下问题:
>您不能仅使用system(),因为系统不在全局范围内
>你不能使用self.system(),因为在这种形式中,python自动将self作为第一个参数传递,但是system()没有参数,你将获得TypeError:system()不带参数(给定1个)
>你不能使用test.system(),因为system()看起来像一个普通的方法,你会得到TypeError:必须用测试实例作为第一个参数调用unbound方法system()(没有任何改为)
围绕这些问题有几种方法:
>将导入平台置于顶层,并在任何地方使用platform.system(),从而解决prev的问题#1.名单
>使用staticmethod装饰器,修复prev的问题#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])
在此示例中,从sys import argv移动是有效的,因为仅在运行脚本时才需要它.但是当您将其用作导入模块时,此导入中不需要它.
但这不是你的情况,因为在你的情况下,测试类总是需要system(),所以没有理由将这个导入从顶层移动.把它留在那里,没关系.
标签:python,python-import
来源: https://codeday.me/bug/20190716/1482494.html