【问题标题】:How to build a package out of a class如何从一个类中构建一个包
【发布时间】:2016-07-04 01:50:30
【问题描述】:

我编写了一个名为 editClass 的类,它工作正常。该类完全在文件editClass.py 中定义。构造函数由:

def __init__(self,filename):
    self.File=filename

我现在想构建一个只包含这个类的包。将来当然还有其他课程......我花了一些时间在谷歌上,在这里搜索它是如何工作的,但我已经走到了某种死胡同。到目前为止,我有以下文件

setup.py
edit/__init__.py
edit/editClass.py

editClass 中的类定义保持不变并且有效。 init 只包含: 从编辑类导入编辑类 并且设置是

from setuptools import setup

setup(name='edit',
     version='0.1.0',
     packages=['edit'],
     author='my name'
     )

我在 shell 中使用 $python setup.py install 安装了它。这似乎奏效了。在测试文件 test.py 中,我想调用 editClass 的构造函数。但是

import edit
filename= "name.txt"
test=edit.editClass(filename)

不起作用。错误消息是:

AttributeError: 'module' 对象没有属性 'editClass'

我不知道我是否提到了构造函数 weargle 或者问题是否已经在安装的包中。老实说,我什至不知道如何检查。

编辑:因为 从编辑导入编辑类 也不起作用,我认为问题出在包的定义中。

【问题讨论】:

    标签: python class constructor packages


    【解决方案1】:

    鉴于你的代码结构,你需要改变

    import edit
    filename= "name.txt"
    test=edit.editClass(filename)
    

    import edit.editClass
    filename = "name.txt"
    test = edit.editClass.editClass(filename)
    

    您实际上得到的是一个名为edit 的包,其中包含一个名为editClass 的模块,其中包含一个名为editClass 的类。因此,您的导入需要导入模块 (edit.editClass),然后您需要使用模块名称来限定类。或者你可以这样做

    from edit.editClass import editClass
    filename = "name.txt"
    test = editClass(filename)
    

    另一方面,如果您要实现的目标是让您的客户端代码看起来像您拥有的那样,那么您需要将 editClass 类定义放入一个名为 edit.py 的文件中。

    【讨论】:

    • 如果我这样做,我会得到 ImportError: No module named editClass
    • @Glostas 哪一个给您带来了问题?我已经概述了实现您想要实现的目标的三种方法。是最后一个吗?因为这涉及更改您的 setup.py,我没有提到。
    • 我只尝试了前两种方法。两种情况下的错误信息相同
    • 听起来 Python 没有将 editClass 识别为模块。检查模块是否安装正确,并且其中有一个 init.py。
    • 我不知道为什么,但我昨天发布的代码现在可以工作了。也许 RAM 中有什么奇怪的东西……
    猜你喜欢
    • 1970-01-01
    • 2018-05-26
    • 2020-06-25
    • 2013-12-05
    • 2017-01-23
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    • 2016-01-30
    相关资源
    最近更新 更多