Python对象可以调用继承堆栈中较低的方法吗?

时间:2018-11-16 05:27:21

标签: python inheritance

我正在尝试观看有关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()

执行代码时如何调用该方法?

1 个答案:

答案 0 :(得分:3)

调用Derived().foo()时,绑定到self中的Base.foo的对象不是 Base的实例;它是Derived的实例,因此对bar的查找将成功。 Base().foo()将因相同的逻辑而失败:绑定到Base的{​​{1}}的实例将不会找到self的定义。

在您的bar / Higher示例中,采用了相同的推理:Lower的实例根本无法访问名为Higher的属性。唯一的不同是您立即失败,在由{{1定义的方法中,您的lower_method实例绑定到全局名称Higher而不是绑定到名称higher }}。

名称是静态作用域的,但查找是动态发生的。