python实例化嵌套类

时间:2018-07-13 09:15:05

标签: python inner-classes

我读了几篇有关嵌套类的文章,但是这种机制对我来说仍然不清楚。

基本上我想要做的是定义一个类(以解决普通的微分方程,在该微分方程中,我为每个精度阶数定义一个类)

这是课程:

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'
------------------------------------------------------------

0 个答案:

没有答案