Наследование в пакете Python между модулями - PullRequest
0 голосов
/ 28 февраля 2020

Я пытаюсь реализовать наследование между двумя классами внутри двух модулей в пакете. Моя текущая структура каталогов выглядит следующим образом:

bin/
  main.py 

packages/
  __init__.py
  modA.py
  modB.py

tests/
  testA.py
  testB.py

В основном я вызываю функции из модулей, расположенных в пакетах. В моде есть класс "класс А". В modB есть класс "класс B".

Классу B необходим доступ к переменным класса из класса A, поэтому я хочу, чтобы класс B наследовал от класса A.

Внутри моего __ init __ .py У меня есть

#!/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'

Когда я удаляю наследование и вместо этого просто создаю экземпляр класса A внутри метода init класса B, с кодом не возникает никаких проблем.

#!/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()  
ImportError: cannot import name 'classA' from 'packages.modA' (../pacakages/modA.py)

1 Ответ

0 голосов
/ 28 февраля 2020

Я не знаю, к каким переменным вы пытаетесь обратиться, так как это могут быть переменные класса или переменные экземпляра. Для каждого структура классов может меняться.

, если вы хотите получить доступ к 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 (вы удалите 'class_a' из classB Конструктор)

class ClassA(object):
    x = 'Something'
    y = 'Something else'
    def __init__(self):
        ClassA.x = 'My'
        ClassA.y = 'Class'

    def Amethod(self):
        ClassA.concatenation = ClassA.x + ClassA.y
        return ClassA.concatenation



class ClassB(ClassA):
    def __init__(self):
        xB =  ClassA.x
        yB =  ClassA.y

построение объекта с использованием переменных класса будет выглядеть так:

objectB = ClassB()
objectB.Amethod()

построение объекта с использованием переменных экземпляра будет выглядеть так:

objectA = ClassA()
objectB = ClassB(objectA)

Также , в вашем init .py вы написали:

form .modA import class A

Я не знаю, является ли это непреднамеренным, но мне кажется, что у вас есть дополнительный пробел, поскольку ваши имена классов - classA, classB

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...