我将在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代码,以便获得所需的输出?
答案 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#样本完全不同。