如何决定从父类或子类调用子类中的重写方法?

本文关键字:子类 调用 重写 方法 父类 何决定 决定 | 更新日期: 2023-09-27 18:02:36

我将在Python中实现下面的c#代码段。事实上,当我从类B实例化一个对象时,我倾向于在重写方法的父版本或子版本之间进行选择时获得一些灵活性,如下所示:

class A
{
    public virtual void show()
    {
        Console.WriteLine("Print A");
    }
}
class B : A
{
    public override void show()
    {
        Console.WriteLine("Print B");
    }
}
class Program
{
    static void Main(string[] args)
    {
        A a;
        a = new A();
        a.show();
        a = new B();
        a.show();
        Console.ReadKey();
    }
}

其中输出为:

Print A
Print B

但是我对python中的超级关键字没有明确的想法。我写了下面的代码:

class A(object):
    def f(self):
        print("A.f()")
class B(A):
    def f(self):
        print("B.f()")
        return super().f()
b = B()
b.f()

,输出为:

B.f()
A.f()

不是我想要的输出;在后一种情况下,即Python一种,两个字符串仅由一个方法调用生成。

你能帮我更改python代码,以便获得所需的输出吗?

如何决定从父类或子类调用子类中的重写方法?

如果您不希望调用A.f(),没有什么可以强制您使用super().f():

class A(object):
    def f(self):
        print("A.f()")
class B(A):
    def f(self):
        print("B.f()")
a = A()
a.f()
b = B()
b.f()

上面所做的正是你的c#代码所做的;创建两个独立的实例并在每个实例上调用f(),其中B.f()完全取代A.f()的工作。

您仍然可以从A中获取未绑定的函数并传入B()的实例:

b = B()
A.f(b)  # unbound A.f(), passing in an instance of `B`

或者您可以在不引用父类的情况下查找父方法,使用:

super(type(b), b).f()