пакет в питоне с наследованием - PullRequest
0 голосов
/ 16 ноября 2018

Я знаю, что этот аргумент тривиален и рассматривается во многих постах, но я его прочитал и до сих пор не понимаю, как из папки можно рассматривать как пакет ... возьмите этот пример (я знаю, что есть файлы * rc, которые дают тот же результат ..) Я определил базовый класс с именем basequalityplot, в котором я определил все, что необходимо для настройки графика (отсос, в котором я определил общий параметр (устойчивый или переменный), обновление rcParams) в Имя класса, качественный сюжет, который содержит базовый класс и многое другое ...: полный класс с именем basequalityplot.py сообщается в: введите описание ссылки здесь

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

 import sys
import os
import matplotlib
import matplotlib.pyplot as plt 
import numpy as np
from matplotlib.ticker import MultipleLocator, FormatStrFormatter 
from matplotlib.axes import Axes
from cycler import cycler
from matplotlib import cm
from collections import OrderedDict
from matplotlib.ticker import AutoMinorLocator
from basequalityplot import BasePlot

#######################################################################
#######################################################################

class Standard(BasePlot):

    def __init__(self,**kwargs):

        self.parameters = kwargs

        if 'box' not in self.parameters.keys():
            self.parameters['box'] = '#AAAAAA' 
        if 'axeslabel' not in self.parameters.keys():
            self.parameters['axeslabel'] = '#AAAAAA'
        if 'axes.linewidth' not in self.parameters.keys():
            self.parameters['axes.linewidth'] = 0.7
        if 'xtickcolor' not in self.parameters.keys():
            self.parameters['xtickcolor'] ='#AAAAAA' 
        if 'ytickcolor' not in self.parameters.keys(): 
            self.parameters['ytickcolor'] = 'gray' 
        if 'gridcolor' not in self.parameters.keys(): 
            self.parameters['gridcolor'] = 'gray' #'#AAAAAA' #'#dddddd'
        if 'font' not in self.parameters.keys(): 
            self.parameters['font'] = 'serif'
        if 'fontstyle' not in self.parameters.keys():
            self.parameters['fontstyle'] = 'italic'
        if 'fontsize' not in self.parameters.keys():
            self.parameters['fontsize'] = 10.0
        if 'legendfontsize' not in self.parameters.keys():
            self.parameters['legendfontsize'] =10.0
        if 'legendEdgeColor' not in self.parameters.keys():
            self.parameters['legendEdgeColor'] = '#AAAAAA' #'#dddddd'
        if 'scheme' not in self.parameters.keys():
            self.parameters['scheme'] = 'nb'
        if 'cycle' not in self.parameters.keys():
            self.parameters['cycle']  = self.cycle('0')
        if 'axes.linewidth' not in self.parameters.keys():
            self.parameters['axes.linewidth'] = 0.7
        if 'grid.dashes' not in self.parameters.keys():
            self.parameters['grid.dashes'] = (5,5)
        if 'grid.linestyle' not in self.parameters.keys():
            self.parameters['grid.linestyle'] = '--' 
        if 'linestyle' not in self.parameters.keys():
            self.parameters['linestyle'] = self.linestyles('paper')
        if 'cycle' not in self.parameters.keys():
            self.parameters['cycle'] = self.cycle('0')
        if 'grid.alpha' not in self.parameters.keys():
            self.parameters['grid.alpha'] = '1'
        if 'grid.linewidth' not in self.parameters.keys():
            self.parameters['grid.linewidth'] = 0.7


        self.parameters.update(kwargs)

        super().__init__(**self.parameters)

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

Я пытался создать папку с именем qualityPlot

, а затем из скрипта в подкаталоге попробуйте import qualityPlot, как обычно для импорта packjage ... но это не работает .... Кто-нибудь может мне помочь? :(

Ответы [ 3 ]

0 голосов
/ 16 ноября 2018

Вам нужно «помочь» import, указав ему, где искать:

import sys
sys.path.append("C:/path/to/your/qualityplot/folder")
import qualityPlot

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

0 голосов
/ 16 ноября 2018

Чтобы использовать модули в Python

  • Убедитесь, что в каталоге существует файл __init__.py (обратите внимание на подчеркивание)
  • Обратите внимание, что имя папки и имя файла являются частьюмодуля
  • Убедитесь, что Python найдет путь (скажем, с помощью PYTHONPATH)

В вашем примере

from basequalityplot import BasePlot

Thisожидает найти файл basequalityplot.py в текущем каталоге (или в другом месте непосредственно по пути python или скомпилированной версии).Внутри этого файла он ожидает найти класс BasePlot.

Я хотел бы содержать basequalityplot.py и qualityplot.py в одном каталоге (где qualityplot - это модуль, содержащий класс, который я хочу использовать.. в этом случае я сообщаю только стандартный)

Я пытался создать папку с именем qualityPlot

То, что вы описали здесь, не совсем соответствуетваш пример кода.Если у вас есть структура папок

qualityPlot/
    __init__.py
    basequalityplot.py
    qualityplot.py

Я бы ожидал, что оператор импорта будет читать

from qualityPlot.qualityplot import BasePlot

6.4 в Python Tutorial есть полезный пример https://docs.python.org/3/tutorial/modules.html#packages

0 голосов
/ 16 ноября 2018

Вам необходимо создать (вероятно, пустое) __init__.py в каталоге.

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

Обратите также внимание, что гораздо лучшим шаблоном для ваших параметров является определение словаря значений по умолчанию, а затем его обновление на все, что приходит из kwargs:

self.parameters = {
    'box': '#AAAAAA',
    'axeslabel': '#AAAAAA',
    'axes.linewidth': 0.7,
    'xtickcolor': '#AAAAAA',
    'ytickcolor': 'gray',
    ...
}
self.parameters.update(kwargs)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...