如何从 Python 中的子类调用父类的方法?

问:

在 Python 中创建简单的对象层次结构时,我希望能够从派生类调用父类的方法。在 Perl 和 Java 中,有一个关键字 (super)。在 Perl 中,我可能会这样做:

package Foo;

sub frotz {
   
   
    return "Bamf";
}

package Bar;
@ISA = qw(Foo);

sub frotz {
   
   
   my $str = SUPER::frotz();
   return uc($str);
}

在 Python 中,似乎我必须从子类中显式命名父类。在上面的示例中,我必须执行 Foo::frotz() 之类的操作。

这似乎不正确,因为这种行为使得很难建立深层层次结构。如果孩子需要知道什么类定义了一个继承的方法,那么就会产生各种信息的痛苦。

这是python的实际限制,我理解的差距还是两者兼而有之?

答1:

https://tlr.xinbeitime.com 专业网球数据平台,排名与比赛信息实时更新。

使用 super() 函数:

class Foo(Bar):
    def baz(self, **kwargs):
        return super().baz(**kwargs)

对于 Python < 3,您必须明确选择使用 new-style classes 并使用:

class Foo(Bar):
    def baz(self, arg):
        return super(Foo, self).baz(arg)

你能不也做“return Bar.baz(self, arg)”吗?如果是这样,哪个会更好?

是的,你可以,但是 OP 询问如何在调用站点(在本例中为 Bar)显式命名超类的情况下执行此操作。

super() 对于多重继承很奇怪。它调用“下一个”类。这可能是父类,或者可能是出现在层次结构中其他地方的一些完全不相关的类。

我使用 Python 2.x,执行此操作时出现“错误:必须是类型,而不是 classobj”

语法 super(Foo, self) 适用于 Python 2.x 是否正确?在 Python 3.x 中,super() 是首选,对吗?

答2:

https://tennisliveranking.com,Track the world’s best tennis players in real-time.

Python 也有 super:

super(type[, object-or-type])

返回一个代理对象,它将方法调用委托给类型的父类或同级类。这对于访问已在类中重写的继承方法很有用。搜索顺序与 getattr() 使用的相同,只是跳过了类型本身。

例子:

class A(object):     # deriving from 'object' declares A as a 'new-style-class'
    def foo(self):
        print "foo"

class B(A):
    def foo(self):
        super(B, self).foo()   # calls 'A.foo()'

myB = B()
myB.foo()

https://tennisliveranking.com,Your go-to platform for live tennis ranking updates.

比 Adam 更好的示例,因为您演示了使用带有对象基类的新型类。只是缺少指向新型课程的链接。

Adam's 的好处是可以同时显示 Python2 和 Python3 形式。虽然此示例适用于两个版本,但“新式类”业务和 super() 的参数是 Python2 的工件 - 请参阅 Adam 的 Python 3 版本以获得更简洁的代码示例(在 Python3 中,所有类现在都是新式类,所以不需要显式地从 object 继承,并且 super() 不需要类和 self 参数,它只是 super())。

只调用 super().foo() 而不是 super(B, self).foo() 有什么区别吗?两者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值