внутренние классы Python как создать - PullRequest
0 голосов
/ 01 октября 2018

Я пытаюсь создать класс с именем My_Axes.У него есть модуль 'size', который принимает в качестве аргументов размер фигуры, nx, ny - сколько графиков и делится - (True или False), хочу ли я поделиться Xaxis или нет.

Тогдаесть внутренний класс под названием «Стиль».Он предназначен для изменения вида осей, возвращаемых My_Axes.size ().В этом случае я нацеливаюсь на матлаб, похожий на тонкие топоры и шрифт Helvetica.Ниже мой код.Пожалуйста, прости меня, так как я все еще изучаю Python.

class My_Axes:

       def __init__(self):

              self.style = self.Style()

       def size(self,fig_siz,nx,ny,share):
              import matplotlib.pyplot as plt
              from matplotlib.ticker import MaxNLocator 
              import numpy as np 


              self.fig_siz=fig_siz
              self.nx = nx
              self.ny = ny
              self.share = share


              fig = plt.figure(figsize = self.fig_siz)
              x, y = self.fig_siz


              self.nax = {}
              self.n = 0
              for i in range(self.nx):
                     for j in range(self.ny):
                            if self.share:
                                   width = (0.9/self.nx)
                                   height =(0.9/self.ny)
                                   xpos = 0.08 + i*width
                                   ypos = 0.08 + j*height
                                   a = fig.add_axes([xpos,ypos,width,height])
                                   self.nax['ax'+str(self.n)] = a


                                   if j > 0: self.nax['ax'+str(self.n)].set_xticklabels([])
                                   if i > 0: self.nax['ax'+str(self.n)].set_yticklabels([])
                                   self.nax['ax'+str(self.n)].yaxis.set_major_locator(MaxNLocator(prune='lower'))
                                   self.nax['ax'+str(self.n)].xaxis.set_major_locator(MaxNLocator(prune='lower'))
                                   self.n += 1
                            else:
                                   width = ((0.6+(x+y)/180.)/self.nx)
                                   height =((0.6+(x+y)/180.)/self.ny)
                                   xpos = 0.08 + (width  + 0.1)*i
                                   ypos = 0.08 + (height + 0.1)*j
                                   a = fig.add_axes([xpos,ypos,width,height])
                                   self.nax['ax'+str(self.n)] = a
                                   self.n += 1

                            axx = self.nax       
              return axx

       class Style:

              def __init__(self,axx):
                     self.nax = axx

              def matlb(self):

                     from matplotlib import rc, font_manager


                     ticks_font = font_manager.FontProperties(family='Helvetica', style='normal',
                     size=12, weight='normal', stretch='normal')
                     for a in sorted(self.nax):
                            aax = self.nax[a].xaxis
                            aay = self.nax[a].yaxis

                     for axis in ['bottom','left']:
                            self.nax[a].spines[axis].set_linewidth(0.3)

                     for axis in ['right','top']:
                            self.nax[a].spines[axis].set_visible(False)
                     aax.set_ticks_position('bottom')
                     aay.set_ticks_position('left')

                     lsiz = 8 + 4./self.n
                     self.nax[a].xaxis.set_tick_params(labelsize=lsiz)
                     self.nax[a].yaxis.set_tick_params(labelsize=lsiz)
                     return self.nax

#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@


aax = My_Axes().size((8,8),3,3,True)


aax.style.matlb

Когда я запускаю код, я получаю сообщение об ошибке:

Traceback (most recent call last):
  File "/Users/aya/Desktop/test_class2.py", line 103, in <module>
    aax = My_Axes().size((8,8),3,3,True)
  File "/Users/aya/Desktop/test_class2.py", line 23, in __init__
    self.style = self.Style()
TypeError: __init__() takes exactly 2 arguments (1 given)
[Finished in 0.5s with exit code 1]
[shell_cmd: python -u "/Users/aya/Desktop/test_class2.py"]
[dir: /Users/aya/Desktop]
[path: /usr/local/opt/coreutils/libexec/gnubin:/usr/local/bin:/bin:/usr/bin:/usr/sbin:/usr/local/sbin:/bin:/sbin:/Library/TeX/texbin:/opt/X11/bin]

1 Ответ

0 голосов
/ 01 октября 2018

Ваше исключение происходит, потому что класс Style не имеет конструктора, который принимает ноль не-self параметров, что и требуется при вызове aax = My_Axes()... в нижней части кода.

Проблема возникает на линии, где вы звоните self.style = self.Style().

Если вы хотите создать там объект Style, вам нужно отредактировать конструктор My_Axes, чтобы он передавал действительный параметр axx в вызов self.Style(axx), например:

class My_Axes:

       def __init__(self, fig_siz,nx,ny,share):
              axx = self.size(fig_siz,nx,ny,share)
              self.style = self.Style(axx)

       # ...

       class Style:
              def __init__(self, axx):
                     # ...
#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

aax = My_Axes((8,8),3,3,True)

aax.style.matlb()
...