这是上一个问题的后续,我在这个问题上把事情复杂化了。OOP 中的依赖关系可以通过继承或组合来强制执行。在这个例子中,我尝试使用继承。我想用 OOP 对以下简单的方程组进行建模:T = c_v*t/(a*h)**2U = (T**3/(T**3+0.5))使用__init__and__call__方法,并且感谢这个链接,它展示了一种使用面向对象结构建模数学函数的优雅方式,我能够做到以下几点:class T: def __init__(self, c_v, a, h): self.c_v = c_v self.a = a self.h = h def __call__(self, t): return self.c_v*t/(self.a*self.h)**2class U(T): def __call__(self, t): T = super().__call__(t) return (T**3/(T**3+0.5) )**(1/6)然后是以下内容:>>> U_func = U(1.5E-7, 0.5, 12)>>> U_func(100*24*60*60)输出正确的结果。然而,第 12 行T = super().__call__(t)有点困扰我。我在那里覆盖类定义T吗?我真的不想那样做。另外,我不想在那里为T变量(而不是类)编一个新名称。是否T仅限于实例方法范围,还是我实际上覆盖了类的定义T?
2 回答

肥皂起泡泡
TA贡献1829条经验 获得超6个赞
有两个不同的变量名为T
:
一个类绑定到
T
当前模块全局范围内的名称。该类的实例绑定到
T
函数本地范围内的名称U.__call__
。
它们是完全独立的,除了在内部__call__
,您必须通过限定名称来引用该类,例如__name__.T
,因为局部变量T
会隐藏全局变量。

长风秋雁
TA贡献1757条经验 获得超7个赞
我在那里覆盖类定义
T
吗?
不。在函数中分配的变量对外部隐藏,在它们自己的私有“范围”中。您在这里所做的称为遮蔽全局变量,不推荐但不会覆盖它。相反,您应该只使用不同的名称。如果您执行以下操作,该函数只会在全局范围内分配变量:
def foo(): global bar bar = 'new value'
添加回答
举报
0/150
提交
取消