【问题标题】:Am I overwriting my superclass definition in the subclass method if I use the same name as the superclass?如果我使用与超类相同的名称,我是否会在子类方法中覆盖我的超类定义?
【发布时间】:2020-02-16 05:57:14
【问题描述】:

这是previous question 的后续行动,我在其中使事情变得过于复杂。 OOP 中的依赖关系可以通过继承或组合来强制执行。在这个例子中,我尝试使用继承。我想用 OOP 对以下简单的方程组进行建模:

T = c_v*t/(a*h)**2
U = (T**3/(T**3+0.5))

使用__init____call__ 方法,感谢this link,它展示了一种使用面向对象结构建模数学函数的优雅方式,我能够做到以下几点:

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 类的定义?

【问题讨论】:

标签: python oop namespaces


【解决方案1】:

有两个不同的变量名为T

  1. 一个类在当前模块的全局范围内绑定到名称T
  2. 该类的一个实例在函数 U.__call__ 的本地范围内绑定到名称 T

它们是完全独立的,除了在__call__ 中,您必须通过像__name__.T 这样的限定名称来引用该类,因为局部变量T 会影响全局变量。

【讨论】:

  • 这也是一个非常好的答案,但不幸的是我必须选择一个。
【解决方案2】:

我是否在那里覆盖了类定义T

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

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

【讨论】:

  • 您提到不建议使用阴影。您能否指出在这种情况下推荐什么?
  • 如果你真的很擅长 python 命名空间并且知道你在做什么,我想你可以使用相同的名字。我问这个问题的事实意味着我不是这样,这可能是接下来要解决的一件好事。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-24
  • 2013-07-07
  • 2020-11-10
  • 1970-01-01
相关资源
最近更新 更多