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

时间:2014-05-10 10:38:23

标签: c# python

我将在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中的super关键字没有明确的想法。我写了下面的代码:

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 one,这两个字符串只能通过一次方法调用生成。

请您帮我改变python代码,以便获得所需的输出?

1 个答案:

答案 0 :(得分:1)

如果您不希望调用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()

然而,这与您原来的C#样本完全不同。