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()
我正在尝试创建一个名为 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()