Python类之继承

本文介绍了Python中的类继承,包括子类如何继承父类的公有变量和方法,以及如何调用父类的方法。同时阐述了Python3中所有类默认继承自object,子类可以通过`super()`调用父类构造方法。还详细讨论了多重继承的特性,如构造方法的调用顺序、方法查找规则,并提到了多继承时方法解析顺序(MRO)遵循广度优先或深度优先原则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

继承:子类具备所有父类的公有变量和公有方法
如果子类没有定义__init__构造方法,会自动调用父类的。
子类定义__init__了函数,不会自动调用父类的。
好处:站在老爸的肩膀上,增加属性,增加方法,在原有的基础上进行扩展。
如果父类中有私有变量,那么子类的方法是不能读取父类中的私有变量的

Python3中,所有类都默认继承自object,这3种声明类的方式是等价的:
class P:
class P():
class P(object):

子类想使用父类的构造方法、变量,则必须在子类的构造方法中来完成父类实例的构造方法的调用

class Person:
    def __init__(self,name):
        self.name = name
        
    def set_name(self,name):
        self.name = name

    def get_name(self):
        return self.name

class AsianPerson(Person):

    def __init__(self,name,nation):
        Person.__init__(self,name)  
#等价   super().__init__(name)       
        self.nation = nation

    def get_name(self):#重写了父类中的方法
        return "****:"+self.name

ap= AsianPerson("laowang","china")
print(ap.get_name())

子类调用父类的方法有两种方式:
1、Parent.parentMethod(self)
2、self.parentMethod()
第一种是直接用父类的类名.方法名去调用父类的方法,但是需要注意的是,这种调用方法必须将self作为参数传进去并且作为第一个参数,表示指向这个类的实例本身。这种方法多用于方法重写时。
第二种是直接用self去调用父类的方法,为什么可以这样调用呢?因为一旦子类继承了父类,那么子类就拥有父类所有的公有方法和属性,所以此时父类的方法和属性就相当于子类自己了,所以可以直接用self去直接调用实例的方法,而不用再传入self参数了。

子类调用基类的构造函数有两种方法,基本语法如下:
1、super(subclassName,self).init([parameter1[,parameter2…]])
2、superclassName.init(self,[parameter1[,parameter2…]])
#父类名↑
注意:
两次参数列表中的self参数都是必不可少的,如果基类的构造方法中有除了self参数外别的参数,调用时,也必须传入同等数量、同等类型的参数。
当子类不定义自己的构造方法时,默认会自动调用父类的构造方法
Python中super函数只能在构造方法中使用。

class A(object):
    name = ''
    def __init__(self):
        self.name = 'fosterwu'
		
    def getName(self):
        return 'A ' + self.name
		
class C(A):
    def __init__(self):
        super(C,self).__init__() #调用基类构造方法
	
if __name__ == '__main__':
    c = C()
    print(c.getName())

多重继承
Python支持多重继承,也就是一个子类可以有多个父类,定义子类时,括号中写多个父类,并且父类间用逗号隔开。
在多重继承中,子类有那么多的父类,那子类实例化时,构造方法时怎样调用的呢?
这里需要记住几点:
多重继承中,子类在没有定义自己的构造方法时,以第一个父类为中心。
如果子类重新定义了自己的构造方法,就不会调用父类的构造方法。但如果仍想调用父类的构造方法,这个时候调用哪个父类的构造方法,由你自己确定,并且多重继承时,调用具体哪个父类的构造方法时只能使用如下方法:superclassName.init(self,[parameter1[,parameter2…]])
如果父类中有同名的方法时,通过子类的实例对象去调用的该方法也是第一个父类中的方法。同样你可以用我们上边说的"子类调用基类方法"中的方法去调用具体哪个父类中的方法。Parent.parentMethod(self)
需要多个构造函数参数时,都需要做初始化

从父类、爷爷类去查找方法,叫做深度优先
从多继承的同级类去查找方法,叫做广度优先
多继承的时候,如果都继承了某个类,Py3的方法查找是广度优先,否则是深度优先。

class D:
    def bar(self):
        print ('D.bar')

class C(D):
    def bar1(self):
        print ('C.bar')

class B(D):
    pass

class A(B, C):
    pass

a = A()
a.bar()

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值