Python类的继承

王大力测试进阶之路

共 5008字,需浏览 11分钟

 ·

2022-04-24 22:07

类的继承可以看成对类的属性和方法的重用,能够大大的减少代码量,继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,也就是说在python中支持一个儿子继承多个爹。


通过继承创建的新类为子类或者派生类,被继承的类称为基类、父类或超类


1、子类会继承父类所有的功能属性和方法,并且子类能够拥有自己的属性和方法;对原来的父类不会产生任何影响。单继承中只有一个父类,而多继承中有多个父类

2、调用属性和方法时,优先调用子类的,子类没有再调用父类的,当子类的属性和方法与父类的属性和方法名称重复时,以子类的属性和方法为准

class Person(object):    name='Person类name'    age='Person类的age'    def __init__(self,name,age):        self.name=name        self.age=age        print('这里是Person类的构造方法')    def eat(self):        print('%s 在吃饭(Person类eat方法)'%self.name)    def sleep(self):        print('%s 在睡觉(Person类sleep方法)'%self.name)class Teacher(Person):    name='Teacher类的name'    def eat(self):        print('%s 在吃饭(Teacher类eat方法)' %self.name)test=Teacher('橙子',11)test.eat()test.sleep()
这里是Person类的构造方法橙子 在吃饭(Teacher类eat方法)橙子 在睡觉(Person类sleep方法)Process finished with exit code 0

如果子类有构造方法,未重写父类构造方法,实例化子类时,会调用子类构造方法,实例属性会先找子类的实例变量,再找子类类变量,最后找继承类的类变量

class Person(object):    name = 'Person类name'    age = 'Person类的age'
def __init__(self,name,age): self.name=name self.age=age print('这里是Person类的构造方法')
class Teacher(Person): name='Teacher类的name' def __init__(self,age): self.age=age print('这里是Teacher类的构造方法')

test = Teacher(20)print(test.name,Teacher.name)print(test.age,Teacher.age)
这里是Teacher类的构造方法Teacher类的name Teacher类的name20 Person类的ageProcess finished with exit code 0

如果子类没有构造方法,未重写父类构造方法,实例化子类时,会调用父类构造方法,实例属性会先找子类的实例变量,再找子类的类变量,最后找父类类变量,类属性会先找子类类变量,再找父类类变量

class Person(object):    name = 'Person类name'    age = 'Person类的age'
def __init__(self,name,age): self.name=name self.age=age print('这里是Person类的构造方法')
class Teacher(Person): name='Teacher类的name' a=111

test = Teacher('橙子',30)print(test.name,test.a,Teacher.name)print(test.age,Teacher.age)
这里是Person类的构造方法橙子 111 Teacher类的name30 Person类的ageProcess finished with exit code 0

3、多重继承时,有相同名称的属性和方法时,会优先找当前类下的属性和方法

class A(object):    passclass B(A):    passclass C(A):    name='C类name'    def func(self):        print('C类func')class D(C,B):    name='D类name'    def func(self):        print('D类func')test=D()print(test.name)test.func()
D类nameD类funcProcess finished with exit code 0

当前类下没有,再找继承写在前面的父类的属性和方法

class A(object):    passclass B(A):    name='B类name'    def func(self):        print('B类func')class C(A):    name='C类name'    def func(self):        print('C类func')class D(C,B):    passtest=D()print(test.name)test.func()
C类nameC类funcProcess finished with exit code 0

前面继承类没找到,再去继承写在后面的父类属性和方法

class A(object):    passclass B(A):    name='B类name'    def func(self):        print('B类func')class C(A):    passclass D(C,B):    passtest=D()print(test.name)test.func()
B类nameB类funcProcess finished with exit code 0

父类下都没找到属性和方法,再找爷爷类下的属性和方法

class A(object):    name='A类name'    def func(self):        print('A类func')class B(A):    passclass C(A):    passclass D(C,B):    passtest=D()print(test.name)test.func()
A类nameA类funcProcess finished with exit code 0

4、多重继承时,若子类有构造方法,实例化子类时,会优先自动调用子类构造方法;

class A(object):    def __init__(self):        print('这个是A类构造函数')    passclass B(A):    def __init__(self):        print('这个是B类构造函数')    passclass C(A):    def __init__(self):        print('这个是C类构造函数')    passclass D(C,B):    def __init__(self):        print('这个是D类构造函数')    passtest=D()
这个是D类构造函数Process finished with exit code 0

若子类没有构造方法,会自动调用写在前面父类的构造方法;再找后面父类的构造方法;

class A(object):    def __init__(self):        print('这个是A类构造函数')    passclass B(A):    def __init__(self):        print('这个是B类构造函数')    passclass C(A):    def __init__(self):        print('这个是C类构造函数')    passclass D(B,C):    passtest=D()
"C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/Test/Test/test.py这个是B类构造函数Process finished with exit code 0

若子类没有构造方法前面的父类也没有构造方法;会自动调用后面父类的构造方法;

class A(object):    def __init__(self):        print('这个是A类构造函数')    passclass B(A):    passclass C(A):    def __init__(self):        print('这个是C类构造函数')    passclass D(B,C):    passtest=D()"C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/Test/Test/test.py这个是C类构造函数
Process finished with exit code 0

若子类和父类都没有构造方法,会自动调用爷爷类的构造方法。

class A(object):    def __init__(self):        print('这个是A类构造函数')    passclass B(A):    passclass C(A):    passclass D(B,C):    passtest=D()"C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/Test/Test/test.py这个是A类构造函数
Process finished with exit code 0

5、调用父类,若有构造函数,在实例化子类时就要传相应多的参数,需要多传参数时,就需要重构父类

6、如果在子类需要父类的构造方法就需要显式地调用父类的构造方法,或者重写父类的构造方法。如果重写了__init__ 时,实例化子类,就不会调用父类已经定义的 __init__,要继承父类的构造方法,可以使用 super 关键字重写父类构造函数

class Person(object):    name='Person类name'    age='Person类的age'
def __init__(self,name,age): self.name=name self.age=age print(self.name) print('这里是Person类的构造方法')

class Teacher(Person): def __init__(self,name,age,sex): super(Teacher,self).__init__(name,age) print('这里是Teacher类的构造方法') self.sex=sex
test=Teacher('橙子',11,'男')print(test.name,test.age,test.sex)

橙子这里是Person类的构造方法这里是Teacher类的构造方法橙子 11 男Process finished with exit code 0

浏览 65
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报