python如何导入函数_Python:在函数中使用类内部导入

这篇博客讨论了在Python类中导入模块的最佳实践。文章指出,将`import`语句放在类的顶部可能会导致作用域问题。作者提供了一个示例,说明如何在类中使用`platform`模块的`system`函数,并建议使用`staticmethod`装饰器来避免错误。此外,还解释了为何通常应该将导入语句放在文件的顶层,除非有特定的运行时条件需要导入。最后,建议根据需要拆分导入,以便在不同情况下使用。
摘要由CSDN通过智能技术生成

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

#!/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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值