python内部类如何创建

python inner classes how to create

我正在尝试创建一个名为 My_Axes 的 class。它有一个模块 'size',它将图形的大小、nx、ny - 有多少图和共享 -(真或假)我是否要共享 X 轴作为参数。

然后里面有个class叫:'Style'。它旨在改变 My_Axes.size() 返回的轴的外观。在这种情况下,我的目标是像细轴和 Helvetica 字体一样的 matlab。下面是我的代码。我还在学习中,请见谅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]

您的异常发生是因为 Style class 没有采用零个非 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()