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但也许更好的方法?
嗯,事情并非那么简单.实际上,import语句在很多方面看起来像直接定义某些东西而不是它.如果你写
class test:
from platform import system
Run Code Online (Sandbox Code Playgroud)
它看起来很像
class test:
def system():
# ....
Run Code Online (Sandbox Code Playgroud)
然后你有以下问题:
self
作为第一个参数传递,但system()没有参数,你会得到TypeError: system() takes no arguments (1 given)
TypeError: unbound method system() must be called with test instance as first argument (got nothing instead)
围绕这些问题有几种方法:
import platform
顶层,并在任何地方使用platform.system(),从而解决prev的问题#1.名单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(),所以没有理由将这个导入从顶层移动.只要留在那里,不要介意.
归档时间: |
|
查看次数: |
5797 次 |
最近记录: |