python - 什么是可变阴影?
问题描述
https://stackoverflow.com/a/37657923/8061009声明该程序:
class Parent(object):
i = 5;
def __init__(self):
self.i = 5
def doStuff(self):
print(self.i)
class Child(Parent, object):
def __init__(self):
super(Child, self).__init__()
self.i = 7
class Main():
def main(self):
m = Child()
print(m.i) #print 7
m.doStuff() #print 7
m = Main()
m.main()
输出将是:
$ python Main.py
7
7
然后,该答案将其与 Java 中的类似程序进行比较:
原因是因为 Java 在 Child 类中的 int i 声明使 i 成为类范围变量,而在 Python 子类化中没有这样的变量阴影。如果在 Java 的 Child 类中删除 int i,它也会打印 7 和 7。
在这种情况下,变量阴影意味着什么?
解决方案
在这种情况下,可变阴影意味着什么?
可变阴影在所有情况下都意味着相同的事情,与上下文无关。它被定义为当一个变量“隐藏”另一个具有相同名称的变量时。因此,当发生变量阴影时,有两个或多个同名变量,它们的定义取决于它们的作用域(意味着它们的值可能因作用域而异)。快速示例:
In [11]: def shadowing():
...: x = 1
...: def inner():
...: x = 2
...: print(x)
...: inner()
...: print(x)
...:
In [12]: shadowing()
2
1
请注意,我们inner()
首先调用它,它分配x
给 be 2
,并按原样打印2
。但这不会修改at 外部范围x
(即 first x
),因为x
in遮蔽了 first 。所以,在我们调用之后,调用返回,现在第一个返回范围,所以最后一个打印输出。inner
x
inner()
x
1
在此特定示例中,您引用的原始作者说没有发生阴影(并且要清楚:没有在实例级别发生)。您会注意到,i
在父级中,与在子级中的值相同i
。如果出现阴影,它们将具有不同的值,就像上面的示例中一样(即,父级将拥有一个变量的副本,i
而子级将拥有一个名为 的变量的不同副本i
)。但是,他们没有。i
在父母和孩子中7
。原作者指出 Python 的继承机制在这方面与 Java 不同。
推荐阅读
- tmux - 使用 tmux 时如何禁用滚动功能?
- vba - WORD - 通过引号中的文本查找和替换文本
- java - 如果被调度作业调用 Dropwizar ,则看不到标有 @Timed 注释的方法
- javascript - 如何在整个文档中搜索特定单词及其前一个单词(在 java 脚本中)
- npm - 如何在 npmjs 上取消发布节点模块?
- powershell - 从远程系统运行 Get-PSDrive 时的 AUDIT_FAILURE
- xslt-2.0 - XML 到 CSV(使用输入日期生成新日期)
- javascript - 如何取消嘲笑要求?
- selenium - 在测试套件中运行特定测试 - Selenium Side Runner (IDE)
- c# - 集合和迭代器的 C# 性能