Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.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_Python 3.x_Class_Inheritance - Fatal编程技术网

模块间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。您建议采用这种方法解决问题还是采用其他解决方案?取决于应用程序的范围。我个人的建议是不惜一切代价避免循环进口,减少循环依赖。如果您只在必要时通过调用类和方法来解决问题,那么您可以在程序的作用域不大的情况下这样做。根据相互连接的类的数量,您的解决方案可能最适合您的应用程序