Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
引用基类的Python类工厂问题?_Python_Class_Import_Factory_Importerror - Fatal编程技术网

引用基类的Python类工厂问题?

引用基类的Python类工厂问题?,python,class,import,factory,importerror,Python,Class,Import,Factory,Importerror,我最近遇到了一个问题,我正在很好地解决这个问题。唯一的区别是我希望基类和子类在不同的包中 然而,当我尝试这样做时,每当我尝试加载基类时,我都会遇到问题 结构: BaseClass.py from subclasses import * def NewClass(): """Map Factory""" for cls in BaseClass.__subclasses__(): print "checking class..." class BaseClass

我最近遇到了一个问题,我正在很好地解决这个问题。唯一的区别是我希望基类和子类在不同的包中

然而,当我尝试这样做时,每当我尝试加载基类时,我都会遇到问题

结构:

BaseClass.py

from subclasses import *

def NewClass():
    """Map Factory"""
    for cls in BaseClass.__subclasses__():
        print "checking class..."

class BaseClass(object):
    def __init__(self):
        print("Building an abstract BaseMap class..")
__all__=['SubClass']
from BaseClass import BaseClass
class SubClassA(BaseClass):
    def __init__(self):
        print('Instantiating SubClassA')
from BaseClass import BaseClass
from subclasses import *

def NewClass():
    """Map Factory"""
    for cls in BaseClass.__subclasses__():
        print ("checking class...")

NewClass ()
子类/\uuuu init\uuuu.py

from subclasses import *

def NewClass():
    """Map Factory"""
    for cls in BaseClass.__subclasses__():
        print "checking class..."

class BaseClass(object):
    def __init__(self):
        print("Building an abstract BaseMap class..")
__all__=['SubClass']
from BaseClass import BaseClass
class SubClassA(BaseClass):
    def __init__(self):
        print('Instantiating SubClassA')
from BaseClass import BaseClass
from subclasses import *

def NewClass():
    """Map Factory"""
    for cls in BaseClass.__subclasses__():
        print ("checking class...")

NewClass ()
子类/SubClass.py

from subclasses import *

def NewClass():
    """Map Factory"""
    for cls in BaseClass.__subclasses__():
        print "checking class..."

class BaseClass(object):
    def __init__(self):
        print("Building an abstract BaseMap class..")
__all__=['SubClass']
from BaseClass import BaseClass
class SubClassA(BaseClass):
    def __init__(self):
        print('Instantiating SubClassA')
from BaseClass import BaseClass
from subclasses import *

def NewClass():
    """Map Factory"""
    for cls in BaseClass.__subclasses__():
        print ("checking class...")

NewClass ()
当我尝试导入基类时,尽管我得到了以下错误:

1 #import BaseClass ----> 2 from BaseClass import BaseClass 3 class SubClassA(BaseClass): 4 def __init__(self): 5 print('Instantiating SubClassA') ImportError: cannot import name BaseClass 1#导入基类 ---->2从基类导入基类 3类子类(基本类): 4定义初始化(自): 5打印(“实例化子流程”) ImportError:无法导入名称基类 我还尝试使用“导入基类”,然后子类化“BaseClass.BaseClass”,但这导致了不同的错误:

1 import BaseClass ----> 2 class SubClassA(BaseClass.BaseClass): 3 def __init__(self): 4 print('Instantiating SubClassA') AttributeError: 'module' object has no attribute 'BaseClass' 1导入基类 ---->2类子类(基类。基类): 3定义初始化(自): 4打印(“实例化子流程”) AttributeError:“模块”对象没有“基类”属性 最后,如果我只是尝试创建子类目录,就没有问题了。只有当我尝试导入基类模块时,才会出现问题


有什么想法吗?

没有更多信息,您的模块
基类
似乎不直接位于python路径上。基类能够找到子类,因为它们存在于基类正下方的目录中。反之亦然

A应该解决这个问题

from .. BaseClass import BaseClass
将进入一个目录,并查看那里(有点像文件路径)。另一种方法是将基类直接放在PYTHONPATH上

老实说,拥有两个相互依赖的不同模块听起来并不是什么好主意。最好让子类注册到基类中

编辑:

我所说的“向基类注册”的意思如下所示:

# baseclass.py
subclasses = []
def register(cls):
    subclasses.append(cls)


# subclass.py
class SubClassA(BaseClass):
    ...

baseclass.register(SubClassA)

现在,基类不需要知道所有不同的子类。它们注册以供使用,并且基类能够在不事先知道它们的情况下使用它们。

一些实验似乎表明问题在于导入递归。使BaseClass.py中的import语句有条件地解决了我的测试问题:

if __name__ == '__main__':
    from subclasses import *
防止递归,python似乎对此感到满意

[编辑]

更好的解决方案是将NewClass方法放在单独的文件中:

something.py

from subclasses import *

def NewClass():
    """Map Factory"""
    for cls in BaseClass.__subclasses__():
        print "checking class..."

class BaseClass(object):
    def __init__(self):
        print("Building an abstract BaseMap class..")
__all__=['SubClass']
from BaseClass import BaseClass
class SubClassA(BaseClass):
    def __init__(self):
        print('Instantiating SubClassA')
from BaseClass import BaseClass
from subclasses import *

def NewClass():
    """Map Factory"""
    for cls in BaseClass.__subclasses__():
        print ("checking class...")

NewClass ()

“另一个错误。”?哪种不同的错误?请也包括此错误。此外,您在BaseClass.py示例中的缩进似乎是错误的。请仔细检查。所有代码都必须缩进。前面有一个空行。您有一个来自子类导入的
*
,它可能是代码,但也可能是问题的一部分。谢谢S.Lott。我解决了你提到的问题。我最初认为添加第二个错误可能太多,所以我将其忽略。输出现在已启动。“添加第二个错误可能太多”?那真的不可能。如果您有其他错误,则必须记录该错误。其他任何事情都是不可接受的,因为您忽略了问题的一部分。嗨,Josh,您还可以使用哪些其他信息?上面应该描述所有代码和文件/目录结构。向基类注册子类是什么意思?此外,我尝试了相对导入,但出现了一个新错误:“ValueError:尝试在toplevel软件包之外进行相对导入”Hi Anton,感谢您的建议。不幸的是,这防止了错误,但破坏了类工厂。例如,如果您尝试调用“BaseClass.NewClass()”,因为没有导入子类,所以不会发生任何事情。@Keith:在这种情况下,您的设计被破坏了,请尝试将代码分离开来,以便一个模块与另一个模块之间的依赖性尽可能小。将函数和基类放在单独的文件中就成功了。谢谢你的帮助:)