在交互式Python Shell中实例化一个类

3

在一个 .py 文件中,我有以下内容:

class avgbox:
    def __init__(self,t,n,a):
        self.t = t
        self.n = n
        self.a = a
    def add(x):
        self.t += x
        self.n += 1
        self.a = t/n

现在,当我在从Ubuntu命令行运行的交互式Python shell中执行from file.py import *时,它没有显示任何错误。然后,当我执行a = avgbox(0,0,0)时,它显示NameError: name 'avgbox' is not defined。有什么想法吗?我做错了什么?谢谢!

使用 from foo import * 几乎总是一个坏主意。 - Wooble
1
尝试使用“from file import avgbox”。 - Joran Beasley
2
你还需要将 self 作为 add 方法的第一个参数! - Peter Varo
我认为from file.py import *应该会报错。请尝试使用from file import * - Ankur Ankan
很可能是因为您没有重新启动交互式解释器,而是获取了一个缓存版本的模块,该模块尚未包含类avgbox。请尝试使用from file import avgbox,如果这不起作用,请重新启动您的交互式解释器。 - Sven Marnach
2个回答

2

我将您的代码复制粘贴到一个名为“file.py”的文件中。然后我进行了以下操作:

from file import *

avgbox(1, 2, 3)

它起作用了。也许你的错误是你在做from file.py import *时应该只做from file import *。请记住,当Python搜索模块名称时,如果它正在查找当前目录中的Python文件,则会自动将.py附加到模块名称后面。当然,您也可以使用from语法在包内搜索,但那是另一回事。

0

您必须确保文件与您的Python解释器在同一目录中。您还必须从from file.py import *中删除.py,因为.py表示包中的不同模块,例如import os.path。如果文件不在Python shell的同一目录中,则必须确保Python能够在PATH变量中找到它。

值得注意的是,通常不应该使用from file import *,因为这会污染导入的命名空间,将其导入为function_names而不是module.function_names。您可以使用from file import function1,function2,...,这将仅将这些函数导入当前命名空间,而不导入其他函数。

此外,在类中,确保在类中的每个函数的第一个参数中放置self,否则将引发语法错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接