自定义包导入问题-属性错误

时间:2019-05-01 02:42:49

标签: python

我有一个自定义包,下面的文件结构...当我import pkg_name导入时,它会导入但pkg_name.add(1,3)会抛出attribute add not found错误

Dir/
   pkg_name/
       __init__.py
       test.py

init.py

from pkg_name.test import Test

test.py

class Test(object):
    def __init__(self):
        self.x = 5
    def add(self,a,b):
        return a + b

我如何使用pkg_name.method?我正在使用python 3

3 个答案:

答案 0 :(得分:1)

“ add”是一个实例方法,您需要创建一个“ Test”对象来调用该方法,或者只是将“ add”重新定义为“ Test”类之外的函数,以便您可以使用“ pkg_name”进行访问.add”语法。

答案 1 :(得分:0)

您的__init__.py文件定义了包的所有成员,即,每个定义的变量x都可以作为pkg_name.x访问。当前定义的唯一成员是pkg_name.Test,因为import语句将对该类的引用分配为名为Test的变量。

您可以以add的方式访问pkg_name.Test.add方法,但是按照目前的编写,它需要Test类的实例,因为它是一个实例方法。使您的示例生效的最简单的方法是创建一个实例,然后立即调用其方法而不保存保存,就像这样:

pkg_name.Test().add(1, 3)

但这可能不是您想要的。使add成为pkg_name函数的一种方法是将其移出Test类,然后将其导入,如下所示:

 # pkg_name/test.py

class Test(object):
    def __init__(self):
        self.x = 5

def add(a,b):
    return a + b

# pkg_name/__init__.py

from .test import Test, add

然后您可以像pkg_name.add(1, 3)这样称呼它。

答案 2 :(得分:0)

您使用该模块的脚本应类似于:

from pkg_name.test import Test 

my_test = Test()
answer = my_test.add(1, 3)

如果您只想在软件包中提供功能add(),请更改软件包本身:

def add(self,a,b):
    return a + b

(而不是类定义。)然后可以像这样使用它:

from pkg_name.test import add

answer = add(1, 3)

模块或包中的代码不必包装在类中,但是也许您只是在尝试编写类。

此外,如果您想要类中的某些内容,但它与类实例中的内容完全独立,则应将其添加为静态方法:

class Test(object):
    def __init__(self):
        self.x = 5
    @staticmethod
    def add(a, b):
        return a + b

请注意,Test.add()在您的代码中根本不引用self,因此最好将其省略,并使类的方法为“静态”。如果要在类中而不是在实例中引用某些内容,也可以将其转换为classmethod,尽管在其他地方也可以继续阅读,但这里有很多这三种方法的示例。 / p>