我有一个自定义包,下面的文件结构...当我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
答案 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>