我正在尝试观看有关here中显示的python技巧的视频。他试图证明在调用扩展该类的开发人员提供的方法时使用更高级别的类时,可以确保该方法已编写。然后,他在两个不同的文件中编写了两个类
-- library.py
class Base():
def foo(self):
return self.bar()
-- user.py
from library import Base
class Derived(Base):
def bar(self):
return 'bar'
现在,我感到困惑的是,为什么自类Base
不能调用继承自该类的任何人的方法,为什么这甚至行得通。例如,以下代码将产生错误。
class Higher():
def higher_method(self):
print("higher method")
class Lower(Higher):
def lower_method(self):
print("lower method")
higher = Higher()
higher.lower_method()
执行代码时如何调用该方法?
答案 0 :(得分:3)
调用Derived().foo()
时,绑定到self
中的Base.foo
的对象不是 Base
的实例;它是Derived
的实例,因此对bar
的查找将成功。 Base().foo()
将因相同的逻辑而失败:绑定到Base
的{{1}}的实例将不会找到self
的定义。
在您的bar
/ Higher
示例中,采用了相同的推理:Lower
的实例根本无法访问名为Higher
的属性。唯一的不同是您立即失败,在由{{1定义的方法中,您的lower_method
实例绑定到全局名称Higher
而不是绑定到名称higher
}}。
名称是静态作用域的,但查找是动态发生的。