为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕斯王 2022-06-28 15:34:27
这是上一个问题的后续,我在这个问题上把事情复杂化了。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

  1. 一个类绑定到T当前模块全局范围内的名称。

  2. 该类的实例绑定到T函数本地范围内的名称U.__call__

它们是完全独立的,除了在内部__call__,您必须通过限定名称来引用该类,例如__name__.T,因为局部变量T会隐藏全局变量。


查看完整回答
反对 回复 2022-06-28
?
长风秋雁

TA贡献1757条经验 获得超7个赞

我在那里覆盖类定义T吗?

不。在函数中分配的变量对外部隐藏,在它们自己的私有“范围”中。您在这里所做的称为遮蔽全局变量,不推荐但不会覆盖它。相反,您应该只使用不同的名称。如果您执行以下操作,该函数只会在全局范围内分配变量:

def foo():
    global bar
    bar = 'new value'


查看完整回答
反对 回复 2022-06-28
  • 2 回答
  • 0 关注
  • 104 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号