我声明了一个类,该类使用定义为类属性的几个硬编码常量进行一些计算。所有方法看起来都类似于以下内容:
class IAPWS_1995:
@staticmethod
def dAr_ddelta(delta, tau, Delta, theta, psi):
_dAr_ddelta = \
sum(IAPWS_1995.n_0 * IAPWS_1995.d_0 * pow(delta, IAPWS_1995.d_0-1) * pow(tau, IAPWS_1995.t_0)) + \
sum(IAPWS_1995.n_1 * exp(-pow(delta, IAPWS_1995.c_1)) * (pow(delta, IAPWS_1995.d_1-1) * pow(tau, IAPWS_1995.t_1) * (IAPWS_1995.d_1 - IAPWS_1995.c_1*pow(delta, IAPWS_1995.c_1)))) + \
sum(IAPWS_1995.n_2 * pow(delta, IAPWS_1995.d_2)*pow(tau, IAPWS_1995.t_2) * exp(-IAPWS_1995.alpha_2*(delta-IAPWS_1995.epsilon_2)**2 - IAPWS_1995.beta_2*(tau-IAPWS_1995.gamma_2)**2) * (IAPWS_1995.d_2/delta - 2*IAPWS_1995.alpha_2*(delta-IAPWS_1995.epsilon_2))) + \
sum(IAPWS_1995.n_3 * (pow(Delta, IAPWS_1995.b_3)*(psi + delta*IAPWS_1995.dpsi_ddelta(psi, delta)) + IAPWS_1995.dDeltab_ddelta(delta, Delta, theta)*delta*psi))
return _dAr_ddelta
类范围限定符使代码(甚至更难)难以读取。我曾想过做些类似的事情来提高代码的可读性:
^{pr2}$但是,如果我将常量声明移到模块范围,我根本不需要范围限定符。在
是否有理由更倾向于在类中声明常量而不是在模块中声明常量(例如,如果将来我有一个类似的类IAPWS_2014
,那么名称空间冲突)在
如果您将来有类似的(可能是现代化的)类,例如
IAPWS_2014
),那么考虑使用classmethod而不是staticmethod是有意义的:这样,这个类的新版本就可以继承旧版本,并且只覆盖实际更改过的变量。如果计算结果发生了变化,则不得重新执行:
^{pr2}$关于您最初的问题,一个更好的副作用是,您可以随意为类命名参数。}也可以工作,并将代码缩写为您的
cls
可能是典型的(根据PEP8,它是canon),但是{_
版本。在另一种方法是简单地创建一个名为
IAPWS_1995
的模块,因为您实际上并没有实例化类中的对象。你的模块看起来像:常量作为模块级变量,类方法是模块级函数。在
其他代码可以这样使用它:
^{pr2}$相关问题 更多 >
编程相关推荐