2017-02-13 24 views
2

Я собираюсь оставить этот вопрос довольно общим, потому что я чувствую, что многие люди делают одно и то же, и я не мог найти ответ consice.Скорость импорта унаследованного модуля Python

Использование PyQt (4 или 5), чтобы программа каждый нуждается в основном следующие строки:

from PyQt5 import QtCore, QtGui 
from PyQt5.QtWidgets import QWidget 

Для каждого виджета, что кто-то хочет создать им нужно написать эти две линии, более или менее. Есть ли способ (быстро) импортировать все эти строки, не импортируя их для каждого виджета?

Для дальнейшего уточнения, что у меня есть основной класс MainWindow, который призывает его дочерний виджет Child

from PyQt5 import QtCore, QtGui 
from PyQt5.QtWidgets import QWidget 

from ChildWidget import Child 

class MainWindow(QMainWindow): 
    def __init__(self): 
     super(MainWindow, self).__init__() 
     widget1 = Child(self) 
     .... 

Файл ChildWidget будет иметь структуру, подобную

from PyQt5 import QtCore, QtGui 
from PyQt5.QtWidgets import QWidget 

class Child(QWidget): 
    def __init__(self, parent): 
     super(Child, self).__init__(parent) 
.... 

(И конечно , импорт будет варьироваться для каждого виджета, но эти два всегда будут там.)

Я знаю, что вместо re gular два импорта в ChildWidget Я могу сделать from MainWindow import *, чтобы импортировать все в MainWindow, но я чувствую, что это медленно, потому что это круговое импортирование всего?

Итак, мой вопрос - это лучший способ импортировать одни и те же функции в каждый виджет, так как число виджета увеличивается, если скорость является серьезной проблемой?

+0

Импорт Python производится только один раз для каждой программы. Любые повторяющиеся операторы импорта просто просматривают кешированную версию, которая при использовании в том, что вы предлагаете, берет небольшие накладные расходы. Нет необходимости избегать их в подмодулях. – user3419537

ответ

0

Это, как представляется, основные возможности (без учета незначительных изменений):

  1. модуль пространств имен:

    from PyQt5 import QtCore, QtGui, QtWidgets 
    
    widget = QtWidgets.QWidget() 
    
  2. Модуль пространств имен с псевдонимами:

    from PyQt5 import QtCore as qc, QtGui as qg, QtWidgets as qw 
    
    widget = qw.QWidget() 
    
  3. импорт Star :

    from PyQt5.QtCore import * 
    from PyQt5.QtGui import * 
    from PyQt5.QtWidgets import * 
    
    widget = QWidget() 
    
  4. Глобальное пространство имен:

    from PyQt5 import Qt 
    
    widget = Qt.QWidget() 
    
  5. Глобальный импорт звезда:

    from PyQt5.Qt import * 
    
    widget = QWidget() 
    
  6. Индивидуальные импорт:

    from PyQt5.QtCore import Qt, QTimer 
    from PyQt5.QtCore import QColor, QFont 
    from PyQt5.QtCore import (
        QApplication, QWidget, QVBoxLayout, QPushButton, 
        QLineEdit, QListWidget, 
        ) 
    

Opti на 3 загрязняет пространство имен модулей с сотнями имен, которые никогда не будут использоваться, так что это generally frowned upon. Вариант 4 выглядит заманчивым, но если вы заботитесь о времени запуска вашего приложения, это плохое решение, поскольку оно импортирует каждый модуль, включая ресурсные свиньи, такие как QtWebEngine. Вариант 5 сочетает в себе худшие аспекты Вариантов 3 и 4, но он действительно дает вам буквально все.

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