猿问

如果我使用与超类相同的名称,我是否会在子类方法中覆盖我的超类定义?

这是上一个问题的后续,我在这个问题上把事情复杂化了。OOP 中的依赖关系可以通过继承或组合来强制执行。在这个例子中,我尝试使用继承。我想用 OOP 对以下简单的方程组进行建模:


T = c_v*t/(a*h)**2

U = (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)**2


class 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?


慕斯王
浏览 105回答 2
2回答

肥皂起泡泡

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

长风秋雁

我在那里覆盖类定义T吗?不。在函数中分配的变量对外部隐藏,在它们自己的私有“范围”中。您在这里所做的称为遮蔽全局变量,不推荐但不会覆盖它。相反,您应该只使用不同的名称。如果您执行以下操作,该函数只会在全局范围内分配变量:def foo():     global bar     bar = 'new value'
随时随地看视频慕课网APP

相关分类

Java
我要回答