2016-04-24 3 views
3

Я борюсь с определением унаследованных классов по нескольким файлам.Наследование классов по файлам

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

Давайте углубимся в качестве примера:

file1.py:

from file2 import SubClass 

class MainClass: 
    def __init__(self): 
    print("This is MainClass") 

mc = MainClass() 
mc.SaySomething() 

file2.py:

from file1 import MainClass 

class SubClass(MainClass): 
    def SaySomething(self): 
    print("This is the subclass") 

Моя цель состоит в том, чтобы разделить огромный класс на несколько файлов, каждый содержащих некоторые связанные функции.

Я пробовал много разных комбинаций, но всегда получаю сообщение об ошибке - все меняется, когда я что-то меняю, но результат тот же; он не работает.

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

Фактически третий файл будет импортировать основной класс и выполнить его. Я думаю, что для этого файла нужно импортировать файл file1.py, поскольку он будет импортировать файл2 - в противном случае исправьте меня, пожалуйста.

Хорошо, так что это часть первая. Тем не менее, мне также интересно, если theres способ, которым я могу сделать несколько вложенных модулей/функций в объекте - для структур.

Я уверен, что пример объяснит это лучше. Могу ли я сделать что-то вроде:

mc = MainClass() 
mc.SubClass.SaySomething() 

... вместо просто mc.SaySomething()? По-моему, я могу сохранить лучшую структуру кода.

+0

Это называется круговой импорт. В файле1 вы импортируете smth. из файла2 и наоборот. Это почти всегда означает, что вы должны изменить свой дизайн. – schwobaseggl

+3

'from file2 import SubClass' не требуется, вы не используете' SubClass' –

+0

Я не уверен, как файл1.py тогда должен знать, что определен подкласс? –

ответ

-1

То, что я понимаю, вы хотите сделать, вы не должны этого делать.

Может быть, вы хотите сделать множественное наследование, я надеюсь, вы понимаете, что на следующем примере:

class A: 
    def __init__(self, number): 
     self.number = number 

    def increase(self): 
     self.number += 1 

class B: 
    def __init__(self, number): 
     self.number = number 

    def decrease(self): 
     self.number -= 1 

class AB(A, B): 
    def __init__(self, number): 
     self.number = number 

ab = AB(10) 
ab.increase() 
print ab.number 

Этим способом вы можете разделить ваши классы в Diferent файлы, а затем сделать MainClass, но я не» Думаю, это будет лучший способ.

+0

Обратите внимание, что циклический импорт возможен в Python. – mwm314

0

Вы можете реорганизовать свой код, чтобы сделать несколько классов, минимизирующих зависимости (как самодостаточные, как они могут получить). Затем вместо наследования попробуйте Состав. Это означает, что вместо усыновления с родителями и дочерними элементами используется утиная печать. Маршрут наследования не будет работать, потому что это будет означать странный круговой импорт. Так,

# a.py 
class A: 
    # some code 
# b.py 
import a 
class B: 
    aobj = a.A() 
    # go on using aobj 

Но, вместо того, чтобы все это вы всегда должны предпочитать пересматривают свой дизайн, уборка его, так что он становится более удобным для чтения. Кроме того, также может случиться так, что, казалось бы, большой класс может быть разделен на несколько кусков, если части кода не будут связаны друг с другом после некоторой проверки.

Смежные вопросы