- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我认为 super() 总是会尝试使用基类中的方法(或属性)运行,直到我遇到一个使用 super().__getattribute__("foo")
。简化代码如下所示。
class Base:
value = "base"
def foo(self):
print(f"Base foo, {self.value}")
class Derived(Base):
value = "derived"
def foo(self):
print(f"Derived foo, {self.value}")
def bar(self):
print(f"Derived bar {self.value}")
print(super().value)
print(super().__getattribute__("value"))
super().foo()
super().__getattribute__('foo')()
d = Derived()
d.bar()
输出,
Derived bar derived
base
derived
Base foo, derived
Derived foo, derived
有点超出我之前的理解,难道只有__getattribute__
是个异常(exception)吗?我无法通过此 doc 获得更多详细信息,希望大家能帮我更清楚地理解这一点,谢谢!
编辑遵循__getattribute__
问题,如下:
class Base:
value = "base"
def foo(self):
print(f"Base foo, {self.value}")
def __getattribute__(self, k):
print(f"Base get attr {self}, {k}")
return super().__getattribute__(k)
class Derived(Base):
value = "derived"
def foo(self):
print(f"Derived foo, {self.value}")
def __getattribute__(self, k):
print(f"Derived get attr {self}, {k}")
return super().__getattribute__(k)
def bar(self):
print("Derived bar")
print(super().value)
print(super().__getattribute__("value"))
d = Derived()
d.bar()
输出为:
Derived get attr <__main__.Derived object at 0x7fb0621dba90>, bar
Base get attr <__main__.Derived object at 0x7fb0621dba90>, bar
Derived bar
base
Base get attr <__main__.Derived object at 0x7fb0621dba90>, value
derived
最佳答案
super()
助手创建一个代理,它自身 修改属性访问。因此:
super().foo
在 super
代理上查找 foo
。
super().__getattribute__
在 super
代理上查找 __getattribute__
。
值得注意的是,两者的结果都不知道它是通过 super
查找的:对结果的任何进一步操作都照常进行。当查找的东西是数据描述符(如方法或属性)时,它会绑定(bind)到初始的 self
,而不是 super
。
最终,查找 super().__getattribute__
在通常情况下只会直接或通过包装器找到标准的 object.__getattribute__
并将其绑定(bind)到 self
。因此,调用 super().__getattribute__("foo")
等同于 object.__getattribute__(self, "foo")
—— 没有 super
参与查找 .foo
。
比较表达式 super().foo
和 super().__getattribute__("foo")
的分解方式可能会有所帮助:
# super().foo
s = super()
foo = s.foo
# super().__getattribute__("foo")
s = super()
g = s.__getattribute__
foo = g("foo")
在第二种情况下,super
代理不参与查找 .foo
。
关于python - 为什么调用 super().foo 和 super().__getattribute__ ("foo"之间有区别),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67379274/
我觉得 for(int i = 0; i < 2; i++) 和 for(int i = 0; i < 2; ++i) 不应该做同样的事情。对于第二个例子,从循环开始 i 应该等于 1 对我来说更符合
我试图牢牢掌握异常情况,以便改进我的conditional loop implementation .为此,我进行了各种实验,扔东西,看看会被抓到什么。 这个让我惊喜不已: % cat X.hs mo
我只是想回答一个问题,但我遇到了一些我不明白的事情!为什么如果我在文件中使用内联 CSS 或 CSS,如本例中的颜色,结果就不一样! 代码相同,但第一段是绿色,第二段是红色! 我真的不明白为什么? 谢
我目前正在学习 CSS 并进行试验,我偶然发现了输出中的这种差异。所以这是代码: .red-text { color: red;
"""module a.py""" test = "I am test" _test = "I am _test" __test = "I am __test" ============= ~ $ p
在向 Firestore 写入文档时,我经常看到 serverTimestamp() 标记和 new Date() 对象之间的差异不为零。 差异范围从几 秒到几十 分钟。 他们不是在做同样的事情吗?
据我了解,2.675 和 numpy.float64(2.675) 都是相同的数字。然而,round(2.675, 2) 给出 2.67,而 round(np.float64(2.675), 2) 给
问题本身的描述很简单。我正在测试 C++11 中 std::thread 库和 boost::thread 库的区别。 这些的输出: #include #include #include int
我只是想将文本文件读入 pyspark RDD,我注意到 sqlContext.read.load 之间的巨大差异和 sqlContext.read.text . s3_single_file_inp
SC.exe 和 InstallUtil 都可以安装/卸载 Windows 服务。但它们的工作方式似乎并不相同。 有什么区别? 例如,InstallUtil 失败(找不到某些文件或依赖项错误),而 S
我认为Thread对象就像是带有名称和静态Thread.CurrentThread()的抽象对象,就像访问Thread对象的方式一样。显然,这是错误的假设。。是这样的吗?
我认为Thread对象就像是带有名称和静态Thread.CurrentThread()的抽象对象,就像访问Thread对象的方式一样。显然,这是错误的假设。。是这样的吗?
我是一名优秀的程序员,十分优秀!