引用基类的Python类工厂问题?
我最近遇到了一个问题,我正在很好地解决这个问题。唯一的区别是我希望基类和子类在不同的包中 然而,当我尝试这样做时,每当我尝试加载基类时,我都会遇到问题 结构: BaseClass.py引用基类的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
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:在这种情况下,您的设计被破坏了,请尝试将代码分离开来,以便一个模块与另一个模块之间的依赖性尽可能小。将函数和基类放在单独的文件中就成功了。谢谢你的帮助:)