模块间Python包内的继承
我试图在包中的两个模块内的两个类之间实现继承。我当前的目录结构如下所示:模块间Python包内的继承,python,python-3.x,class,inheritance,Python,Python 3.x,Class,Inheritance,我试图在包中的两个模块内的两个类之间实现继承。我当前的目录结构如下所示: bin/ main.py packages/ __init__.py modA.py modB.py tests/ testA.py testB.py 我主要是从包中的模块调用函数。 在modA中有一个“a类”。 在modB中有一个“B类” 类B需要从类A访问类变量,所以我希望类B从类A继承 在我的 #!/usr/bin/env python from .modA import class
bin/
main.py
packages/
__init__.py
modA.py
modB.py
tests/
testA.py
testB.py
我主要是从包中的模块调用函数。
在modA中有一个“a类”。
在modB中有一个“B类”
类B需要从类A访问类变量,所以我希望类B从类A继承
在我的
#!/usr/bin/env python
from .modA import class A
from .modB import class B
在我的modB.py里面
#!/usr/bin/env python
import packages
class classB(packages.classA):
def __init__ (self):
self.name = str()
但是,当我尝试运行代码时,我得到了以下错误
AttributeError: module 'packages' has no attribute 'classA'
#!/usr/bin/env python
import packages
class classB():
def __init__ (self):
self.a = packages.classA()
当我删除继承并在类B的init方法中创建类A的实例时,代码没有问题
AttributeError: module 'packages' has no attribute 'classA'
#!/usr/bin/env python
import packages
class classB():
def __init__ (self):
self.a = packages.classA()
上面的操作很好,为什么在实现继承关系时不能识别它呢
注意
我还尝试从init.py文件中删除所有内容,并直接在modA和modB文件中实现导入,但这会导致不同的导入错误
#!/usr/bin/env python
from .modA import classA
class classB(classA):
def __init__ (self):
self.name = str()
我不知道您试图访问哪些变量,因为它可以是类变量或实例变量。对于每个类,类的结构可能会改变 如果您想访问classA,那么必须将实例变量发送到classB才能访问它。您的类将类似于:
class ClassA(object):
def __init__(self):
self.x = 'My'
self.y = 'Class'
def Amethod(self):
self.concatenation = self.x + self.y
return self.concatenation
class ClassB(ClassA):
def __init__(self, class_a):
self.xB = class_a.x
self.yB = class_a.y
如果您试图访问类变量,您可以访问它们,而无需将对象形式classA发送到classB(您将从classB构造函数中删除“class_a”)
使用类变量构建对象如下:
objectB = ClassB()
objectB.Amethod()
objectA = ClassA()
objectB = ClassB(objectA)
使用实例变量构建对象如下所示:
objectB = ClassB()
objectB.Amethod()
objectA = ClassA()
objectB = ClassB(objectA)
另外,在您的init.py中,您写道:
form .modA import class A
我不知道这是否是无意的,但对我来说,似乎你有一个额外的空间,因为你的类名是classA,classB
希望这能有所帮助。您好,在我为本例更改类名时,init.py部分只是一个输入错误。我想从classB中的classA访问一个类变量。如果classA和classB在同一个文件中,那么上面的内容可以正常工作。我遇到的问题是,它们位于两个不同的模块中,因此无法实现继承关系。您的第二个实现就是我正在尝试做的,在classB中,我可以调用类似print(classA.x)的东西,并获取classA变量x的值。如果您使用的是Python 2,它将是“from packages.modA import classA”,如果您使用的是Python 3,它将是“from.modA import classA”。试试这个,让我知道这是否解决了你的问题。另外,我不知道您是否有更多的文件,并且正在从其他文件导入,这可能是由所谓的“循环导入”引起的-在modB类中编写导入语句,而不是在init中,将init保留为空,这只是为了表明可以在目录中导入。问题与循环导入有关是的,当我从classA创建classB的实例时,我也在modA中导入modB,但是我仍然在modB中导入modA。我采用这种方法,仅在需要时在modA中导入modB。您建议采用这种方法解决问题还是采用其他解决方案?取决于应用程序的范围。我个人的建议是不惜一切代价避免循环进口,减少循环依赖。如果您只在必要时通过调用类和方法来解决问题,那么您可以在程序的作用域不大的情况下这样做。根据相互连接的类的数量,您的解决方案可能最适合您的应用程序