python - python实例化一个嵌套类
问题描述
我阅读了几篇关于嵌套类的文章,但这种机制对我来说仍然不清楚。
基本上我想做的是定义一个类(解决常微分方程,其中我为每个精度阶定义一个类)
这是课程:
class AdamsBashforth(AdamsMethods):
class _2nd(AdamsMethods):
startup = False
def __init__(self, dydt : Rhs, filename :str = None , salve : bool = True ):
self.file = filename
self.save = save
super().__init__(dydt)
def solve(self):
self.time , self.u = self.dydt.createArray()
u[1] = rungekutta.RK2.step(self.dydt.f, time[0], u[0], self.dt)
for i in range(1,len(self.time)-1):
self.u[i+1] = u[i] + self.dt/2*(3*self.dydt.f(self.time[i],self.u[i])-self.dydt.f(self.time[i-1],self.u[i-1]))
AdamsBashforth._2nd.solved = True
if self.file != None:
super().write2file()
if self.save:
return self.time,self.u
def plot(self):
if AdamsBashforth._2nd.solved:
super().plot('Sys ODE solution using Adams-Bashforth 2nd order','time [s]','y(t)')
else:
print("Unsolved problem, call `solve` method before")
@classmethod
def step(cls, func , t : np.float , u : np.float, dt ):
def f(ti,ui):
return np.array([function(ti,ui) for function in func])
if AdamsBashforth._2nd.startup == False:
#print ("AB start-up")
AdamsBashforth.u1 = rungekutta.RK2.step(func,t,u,dt)
AdamsBashforth.startup = True
unext = AdamsBashforth.u1 + dt/2.*(3.*f(t+dt,AdamsBashforth.u1) - f(t,u))
AdamsBashforth.u1 = u
return unext
这是我真正想做的方式是打电话:
problem = AdamsBashforth._2nd(dydt)
但我收到一个错误,说adamsbashforth
没有成员_2nd
所以我尝试这样做..但仍然是相同的信息:
class AdamsBashforth(AdamsMethods):
def __init__(self, dydt, filename :str = None , salve : bool = True):
self._2nd = self._2nd(dydt,filename,salve)
def solve(self):
pass
class _2nd(AdamsMethods):
为了获得像第一个(problem = AdamsBashforth._2nd(dydt)
)这样的呼叫的正确方法是什么
并使用class _2nd
编辑
class AdamsBashforth(AdamsMethods):
def __init__(self, dydt, filename :str = None , save : bool = True):
self._2nd = AdamsBashforth._2nd(dydt,filename,save)
def solve(self):
pass
class _2nd(AdamsMethods):
startup = False
solved = False
def __init__(self, dydt : Rhs, filename :str = None , save : bool = True ):
self.file = filename
self.save = save
super().__init__(dydt)
def solve(self):
self.time , self.u = self.dydt.createArray()
self.u[1] = rungekutta.RK2.step(self.dydt.f, self.time[0], self.u[0], self.dt)
for i in range(1,len(self.time)-1):
self.u[i+1] = u[i] + self.dt/2*(3*self.dydt.f(self.time[i],self.u[i])-self.dydt.f(self.time[i-1],self.u[i-1]))
_2nd.solved = True
if self.file != None:
super().write2file()
if self.save:
return self.time,self.u
def plot(self):
if AdamsBashforth._2nd.solved:
super().plot('Sys ODE solution using Adams-Bashforth 2nd order','time [s]','y(t)')
else:
print("Unsolved problem, call `solve` method before")
@classmethod
def step(cls, func , t : np.float , u : np.float, dt ):
def f(ti,ui):
return np.array([function(ti,ui) for function in func])
if AdamsBashforth._2nd.startup == False:
#print ("AB start-up")
AdamsBashforth.u1 = rungekutta.RK2.step(func,t,u,dt)
AdamsBashforth.startup = True
unext = AdamsBashforth.u1 + dt/2.*(3.*f(t+dt,AdamsBashforth.u1) - f(t,u))
AdamsBashforth.u1 = u
return unext
以这种方式调用:
ab2_p1 = adamsmethods.AdamsBashforth(problem1, 'ab2_1.dat')
ab2t,ab2u = ab2_p1._2nd.solve()
ab2_p1.plot()
看起来可行..但我不知道为什么...而且我不知道这是否正确!
但是我仍然有问题要调用类方法,例如:
u = adamsmethods.AdamsBashforth._2nd.step(func0,t,u,dt)
不起作用:
Traceback (most recent call last):
File "drive.py", line 287, in <module>
main()
File "drive.py", line 149, in main
u = adamsmethods.AdamsBashforth._2nd.step(func0,t,u,dt)
AttributeError: type object '_2nd' has no attribute 'step'
------------------------------------------------------------
解决方案
推荐阅读
- amazon-web-services - 如果身份验证失败,AWS API Gateway 将 $context.identity.accountId 记录为“-”?
- flutter - 如何使用 Getx 在已生成的 ListView.builder 中搜索项目
- sql - 填写运行总计的缺失日期
- docker - 带有斜杠的 nginx 上游服务器位置
- javascript - chrome更新后Jquery UI可拖动不起作用
- scala - Spark UDF 现在抛出 ArrayIndexOutOfBoundsException
- json - 如何将我的数据保存在 json 中并将其存储在数据库中(Django rest 框架)
- dompdf - dompdf 每个页面标题显示在左侧缩略图中
- ruby-on-rails - 更改设计邮件程序的模板路径而不是默认的设计邮件程序视图
- javascript - webpack.resolve.alias 不解析节点包?