如何更改类中使用的变量(常量)并更新该类以使用python中的新值?

如何更改类中使用的变量(常量)并更新该类以使用python中的新值?,python,python-3.x,class,dictionary,Python,Python 3.x,Class,Dictionary,我已经试着解决这个问题好几个小时了,却找不到解决办法 我使用我在类中定义的方程。这些方程依赖于常数,我把常数定义为变量。 我的最终目标是能够更改和迭代其中一个常数,从而更新依赖于这些变量常数的方程 例如: constant_1 = 10 constant_2 = 20 class(object): first_eq = constant_1 * constant_2 # I now want to update constant_2 to 40 and thus first_eq s

我已经试着解决这个问题好几个小时了,却找不到解决办法

我使用我在类中定义的方程。这些方程依赖于常数,我把常数定义为变量。 我的最终目标是能够更改和迭代其中一个常数,从而更新依赖于这些变量常数的方程

例如:

constant_1 = 10
constant_2 = 20

class(object):
    first_eq = constant_1 * constant_2

# I now want to update constant_2 to 40 and thus first_eq should change its value
我尝试过的事情:

使用字典列表存储我的常量并更新文件末尾的假装值 对常数和方程使用不同的文件,然后将它们导入新文件,然后尝试从该文件更改常数 定义要更新的函数如果需要,我可以包括已定义的函数常量文件上的值,并在导入常量时将其包含在新文件中我使用该函数来更新我尝试在字典或类中定义的两个常量的文件 还有一些事情我已经记不得了 所有这些方法都可以改变我想要的常量变量,但是方程的值始终保持不变

有什么帮助吗

谢谢你抽出时间

编辑: 正如建议的那样,我将在这里插入与本次讨论相关的代码部分。我的目标是能够改变一个或多个方程中可能存在的给定常数变量,并相应地更新这些方程的值

我的常量文件是:

from PySpice.Unit import *
from PySpice.Physics.PhysicalConstants import *
import numpy as np
import math

constants = {
    "conv" : 1.0e3,
    "T" : 25+273.15,
    "k" : 1.380650e-23,
    "PI" : np.pi,
    "PI2" : np.pi*2.0,
    "q" : 1.602176e-19,
    "NAv" : 6.0221415e23,
    "dWaals" : 0.34e-9,
    "eps0" : 8.854187e-12,
    "epsw" : 78.5,
    "epslys" : 3.0,
    "epsglyco" : 81,
    "ros" : 0.7,
    "roAu" : 2.27e-8,
    "roglyco" : 1.6e6,
    "Cbulk" : 150.0e-3
}
constants["ET"] = constants["q"]/(constants["k"]*constants["T"])

constants["epsmed"] = constants["eps0"]*constants["epsw"]

constants_neuron = {
    "Ncomp" : 5.0,
    "dsomat" : 100.0e-6,
    "daxont" : 10.0e-6,
    "laxont" : 500.0e-6,
    "Rax" : 0.1
}

constants_gme = {
    "phstalk" : 1.0,
    "dmstalk" : 1.0e-6,  # MUDAR PARA d_stalk : 2um
    "hstalk" : 1.0e-6,
    "dmhead" : 2.0e-6,
    "tinsM" : 1.2,
}
constants_cleft = {
    "dsealjGME" : 2e-9,
    "alphahead" : 0.4294*np.pi,
    "Etawm" : 1.0,
    "deltawm" : 1.0,
    "deltawm" : 1.0,
}
我的方程文件是:

from PySpice.Unit import *
from PySpice.Physics.PhysicalConstants import *
import numpy as np
import math
from constants_spice import *
class parameters(object):




# **********************************************************************
# *               NEURON PARAMETERS
# **********************************************************************
# * laxont    Neuron axon length              [m]
# * daxont    Neuron axon diameter                [m]
# * dsomat    Neuron soma diameter                [m]
# * Rax       axoplasmatic resistance per unit length     [ohm*cm]
# * Ncomp     compartments number

    Asomat = (2.0*constants["PI2"]*(constants_neuron["dsomat"]/2.0)*(constants_neuron["dsomat"]/2.0))
    Aaxont = (constants["PI2"]*(constants_neuron["daxont"]/2.0)*constants_neuron["laxont"])
    ANEURt = (Asomat+Aaxont)
    dsoma = (constants_neuron["dsomat"]/constants_neuron["Ncomp"])
    daxon = constants_neuron["daxont"]
    laxon = (constants_neuron["laxont"]/constants_neuron["Ncomp"])
    Asoma = (2.0*constants["PI2"]*(dsoma/2.0)*(dsoma/2.0))
    Aaxon = (constants["PI2"]*(daxon/2.0)*laxon)
    ANEUR = (Asoma+Aaxon)

    # **********************************************************************
    # *               GME PARAMETERS
    # **********************************************************************
    # * phstalk   percentage of engulfed stalk height
    # * hstalk    GME stalk height                [m]
    # * htstalk   GME engulfed stalk height           [m]
    # * dmstalk   GME stalk diameter              [m]
    # * dmhead    GME head diameter               [m]
    # * Astalk    GME stalk area                  [m**2]
    # * Ahead     GME half head area              [m**2]
    # * Arim      GME rim area                    [m**2]
    # * AGME      GME total area                  [m**2]
    # * tinsM     thickness of the insulation coating     [m]

    htstalk = (constants_gme["hstalk"]*constants_gme["phstalk"])
    cirhead = (constants["PI2"]*((constants_gme["dmhead"])/2.0))
    Abstalk = (constants["PI"]*(constants_gme["dmstalk"]/2.0)*(constants_gme["dmstalk"]/2.0))
    Astalk = (constants["PI2"]*(constants_gme["dmstalk"]/2.0)*htstalk)
    Aheadt = (2.0*constants["PI2"]*(constants_gme["dmhead"]/2.0)*(constants_gme["dmhead"]/2.0))
    Ahead = (Aheadt/2.0)
    Arim = (constants["PI"]*((constants_gme["dmhead"]/2.0)*(constants_gme["dmhead"]/2.0)-(constants_gme["dmstalk"]/2.0)*(constants_gme["dmstalk"]/2.0)))
    AGME = (Astalk+Ahead+Arim)

    # *-----------------------Rmicro---------------------------------------
    Rstalk = (constants["roAu"]*((htstalk) / (Abstalk)))
    Rhead = (constants["roAu"]) / (cirhead)
    RGME = (Rstalk+Rhead)
    RGME = RGME@u_Ω
    # * RGME = 20Meg
    # *-------------------------Shunt Capacitance--------------------------------------------
    PHIM = (constants["PI"]/2.0)
    CshGME = (((constants["PI2"]*constants["eps0"]*constants["epslys"])/np.log(constants_gme["tinsM"]))*(htstalk+(constants_gme["dmhead"]/2.0)*np.sin(PHIM)))
    CshGME = CshGME*10**12
    CshGME = CshGME@u_pF
    # print("CshGME = "+str(CshGME))
    # * + CshGME = 1.37e2p The shunt capacitance affects the recording! The Vpeak/
    # is saturated for the value of the article!
    # **********************************************************************
    # *               NUMBER of GMEs
    # **********************************************************************
    # * shxn      minimum distance between two GMEs head centers      [m]
    # * xGME      extra distance between two GMEs head centers        [m]
    # * shn       effective inter-GMEs head distance          [m]
    # * lambdaGME Debye length                        [m]
    # * nGME      number of vertically arranged GMEs in the soma compartment
    # *-----------------------------

    lambdaGME = (np.sqrt((constants["epsmed"]/(constants["q"]*constants["ET"]))*(1.0/(2.0*constants["NAv"]*constants["Cbulk"]*constants["conv"]))))
    lambdaGME = lambdaGME
    shxn = (constants_gme["dmhead"]+constants["dWaals"]+2.0*lambdaGME)
    xGME = 6.0e-6
    shn = (shxn+xGME)
    AmGME = (constants["PI"]*shn*shn)
    AmSOMA = (constants["PI"]*(dsoma/2.0)*(dsoma/2.0))
    nGME = (int(AmSOMA/AmGME))
    # **********************************************************************

    # **********************************************************************
    # *               GME CLEFT PARAMETERS
    # **********************************************************************
    # * dsealjGME cleft width at the neuron-GME junction          [m]
    # * alphahead head starting angle for resistor concentric rings model
    # * etawm     covering factor of the cross-sectional area of the solution.
    # * deltawm   surface overlapping coefficient: percentage of microel.
    # *               sensitive area covered by the neuron
    # *-----------------------------

    Rspreadhead = (((constants["ros"]/constants["PI2"])*(constants_cleft["dsealjGME"]/((constants_gme["dmhead"]/2.0)*((constants_gme["dmhead"]/2.0)+
    constants_cleft["dsealjGME"]))))*constants_cleft["Etawm"])
    H = (htstalk+(constants_gme["dmstalk"]/2.0)+constants_cleft["dsealjGME"])
    Rspreadstalk = (((constants["ros"]/(constants["PI"]*H))*np.log((4.0*H)/(constants["PI2"]*(constants_gme["dmstalk"]/2.0))))*constants_cleft["Etawm"])
    RspreadGME = (Rspreadhead+Rspreadstalk)
    RspreadGME = RspreadGME@u_Ohm
    rodj = (constants["ros"]/(constants["PI2"]*constants_cleft["dsealjGME"]))
    Rsealhead = (rodj*(np.log(np.tan(constants["PI"]/4.0))-np.log(np.tan(constants_cleft["alphahead"]/2.0))))
    Rsealrim = (rodj*(np.log((constants_gme["dmhead"]/2.0)/(constants_gme["dmstalk"]/2.0))))
    Rsealstalk = (rodj*(htstalk/(constants_gme["dmstalk"]/2.0)))
    RsealGME = ((Rsealhead+Rsealrim+Rsealstalk)*constants_cleft["deltawm"])
    RsealGME = RsealGME@u_Ohm
    # print("Rseal="+str(RsealGME))
    # RsealGME = 100@u_GΩ
    # **********************************************************************
    # *
    # **********************************************************************
    # *       GME & GPE ELECTROLYTE INTERFACE PARAMETERS
    # **********************************************************************
    # * Chg       capacitance of EDL at the interface microel-solution    [F]
    # * Rhg       leakage resistance                  [ohm]
    # *-----------------------------
    # PEDOT:PSS PARAMETERS:
    ChgGME = 1.2@u_nF
    RhgGME = 10@u_MΩ

    # ChgGME = 5@u_pF
    # RhgGME = 1500@u_GΩ
    # *---------Amplifier input impedance------------------------
    # *artigo_ventura
    Ra = 450@u_MΩ
    # * + Ca = 10p
    # *input impedance dos artigos do \Spira
    # Ra = 20@u_MΩ
    # *----------------------------------------------------------

    # **********************************************************************
    # *       GME & GPE PROTEIN-GLYCOCALYX EDL PARAMETERS
    # **********************************************************************
    # * Chd       capacitance of EDL at interface of glycocalyx-solution  [F]
    # * Rhd       resistance of the EDL                   [ohm]
    # * tglyco    glycocalyx thickness                    [m]
    # * gammaw    correction factor
    # * fscale    scale factor
    # *-----------------------------
    tglyco = 100.0e-9
    gammawm = 1
    ChdGME = ((constants["epsglyco"]*constants["eps0"])*(AGME/tglyco)*gammawm)
    ChdGME= ChdGME*10**12
    ChdGME = ChdGME@u_pF
    RhdGME = (constants["roglyco"]*(tglyco/AGME)*gammawm)
    RhdGME = RhdGME@u_Ω
    # RhdGME = 100Meg
    fscale = 2.5
注意:文件是这样的,因为我上次尝试使用字典。正如我在开始时所说的,在之前的版本中,我也尝试在同一个类和不同的类中定义所有常量、变量和方程。
再次感谢您。

如果我正确理解了您遇到的问题,那么在运行该行代码时,首先计算eq。除非通过重新计算来明确更改first_eq的值,否则您以后所做的操作不会更改first_eq的值。因此,在设置常量_2=40之后,您应该能够执行myClass.first_eq=constant_1*constant_2,它应该可以正常工作

constant_1 = 10
constant_2 = 20
class TestClass:
    first_eq = constant_1 * constant_2

print(TestClass.first_eq) # Output: 200
constant_2 = 40
print(TestClass.first_eq) # Output: 200 (no change even though we changed constant_2)

TestClass.first_eq = constant_1 * constant_2 # Now actually recalculate first_eq
print(TestClass.first_eq) # Output: 400 
或者,您可以定义一个传递两个常量的函数。这是一个更好的解决方案,因为您不必记住每次更改常量时都要更新first_eq的值,因为您将其当前值传递给计算first_eq的函数

重新。然而,当给定常数存在于各种方程中,并且我需要在每个方程中更新它时,如何实现这一点: 在这种情况下,将常量定义为类的变量更有意义。然后,类的函数可以访问它的变量

class TestClass:
    constant_1 = 10
    constant_2 = 20
    
    @classmethod
    def first_eq(self):
        return self.constant_1 * self.constant_2

print(TestClass.first_eq()) # Output: 200
TestClass.constant_2 = 40
print(TestClass.first_eq()) # Output: 400
现在,您已经在问题中添加了一些代码,下面是我将如何编写代码:

class parameters:
    def __init__(self, constants, constants_neuron, constants_gme, constants_cleft):    
        self.Asomat = (2.0*constants["PI2"]*(constants_neuron["dsomat"]/2.0)*(constants_neuron["dsomat"]/2.0))
        self.Aaxont = (constants["PI2"]*(constants_neuron["daxont"]/2.0)*constants_neuron["laxont"])
        self.ANEURt = (self.Asomat+self.Aaxont)
        self.dsoma = (constants_neuron["dsomat"]/constants_neuron["Ncomp"])
        ...

使用它:

p = parameters(constants, constants_neuron, constants_gme, constants_cleft)
print(p.Asomat)
print(p.Aaxont)
...

这样,所有计算值都封装在parameters类的p实例中。如果希望使用不同的常量计算相同的值,只需在构造parameters对象时传递不同的常量字典。

欢迎使用Stack Overflow!请提供运行并再现您的问题的。目前,classobject:是无效语法。可能包括您尝试过的内容并提出了一个特定的问题?看起来first_eq应该是一个函数,如果它的所有输入都位于类之外,那么它是否属于该类也是一个不同的问题,尽管我已经对我的问题进行了编辑,并进行了相应的修改。谢谢,谢谢你的回答!然而,当给定的常数存在于各种方程中,而我需要在每个方程中更新它时,我们将如何实现这一点?@荒谬的是,我们需要根据您的问题更新进行更多更新,以查看我是否理解您的答案,例如,如果我现在迭代属于dict常量的参数常量dmhead,我将执行以下操作:在此之前,我将把init函数的所有类变量都赋给相应的dict,然后:对于[1,2,3,4]中的I:constants\u neurons[dmhead]=ip=。。。。。。我想得对吗?非常感谢你富有洞察力和迅速的回答,我真的很感激!
p = parameters(constants, constants_neuron, constants_gme, constants_cleft)
print(p.Asomat)
print(p.Aaxont)
...