前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python类的继承

Python类的继承

作者头像
王大力测试进阶之路
发布2022-06-07 18:25:59
1.2K0
发布2022-06-07 18:25:59
举报

类的继承可以看成对类的属性和方法的重用,能够大大的减少代码量,继承是一种创建新类的方式,在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类的name
20 Person类的age
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'
    a=111


test = Teacher('橙子',30)
print(test.name,test.a,Teacher.name)
print(test.age,Teacher.age)

这里是Person类的构造方法
橙子 111 Teacher类的name
30 Person类的age
Process finished with exit code 0

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

class A(object):
    pass
class B(A):
    pass
class 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类name
D类func
Process finished with exit code 0

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

class A(object):
    pass
class 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):
    pass
test=D()
print(test.name)
test.func()

C类name
C类func
Process finished with exit code 0

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

class A(object):
    pass
class B(A):
    name='B类name'
    def func(self):
        print('B类func')
class C(A):
    pass
class D(C,B):
    pass
test=D()
print(test.name)
test.func()

B类name
B类func
Process finished with exit code 0

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

class A(object):
    name='A类name'
    def func(self):
        print('A类func')
class B(A):
    pass
class C(A):
    pass
class D(C,B):
    pass
test=D()
print(test.name)
test.func()

A类name
A类func
Process finished with exit code 0

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

class A(object):
    def __init__(self):
        print('这个是A类构造函数')
    pass
class B(A):
    def __init__(self):
        print('这个是B类构造函数')
    pass
class C(A):
    def __init__(self):
        print('这个是C类构造函数')
    pass
class D(C,B):
    def __init__(self):
        print('这个是D类构造函数')
    pass
test=D()

这个是D类构造函数
Process finished with exit code 0

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

class A(object):
    def __init__(self):
        print('这个是A类构造函数')
    pass
class B(A):
    def __init__(self):
        print('这个是B类构造函数')
    pass
class C(A):
    def __init__(self):
        print('这个是C类构造函数')
    pass
class D(B,C):
    pass
test=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类构造函数')
    pass
class B(A):
    pass
class C(A):
    def __init__(self):
        print('这个是C类构造函数')
    pass
class D(B,C):
    pass
test=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类构造函数')
    pass
class B(A):
    pass
class C(A):
    pass
class D(B,C):
    pass
test=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
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-04-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 橙子探索测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档