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

Python类的继承实例

作者头像
王大力测试进阶之路
发布2019-10-25 18:08:18
2.5K0
发布2019-10-25 18:08:18
举报

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

通过继承创建的新类为子类或者派生类。

被继承的类称为基类、父类或超类

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

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

3、多重继承时,有相同名称的属性和方法时,会优先继承写在前面的父类的重名属性和方法,前面没有再去找下个父类,父类也没有,找爷爷类

4、多重继承时,若子类有构造函数,调用子类构造函数,若子类没有,会调用写在前面父类的构造函数,再找后面的父类,最后找爷类

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

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

实验证明:
1、实例化时,优先调用本类和继承类的构造函数
2、调用属性和方法时,优先调用子类的,子类没有再去父类调用,当子类的属性和方法与父类的属性和方法名称重复时,以子类的属性和方法为准


import requests,json
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()
print(test.name)
print(Teacher.age)


"C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/Test/Test/test.py
这里是Person类的构造方法
橙子 在吃饭(Teacher类eat方法)
橙子 在睡觉(Person类sleep方法)
橙子
Person类的age

Process finished with exit code 0
实验证明:
1、子类有构造函数,优先调用子类的构造函数
2、子类没构造函数,找父类,调用父类构造函数
3、子类没有构造函数,父类也没有构造函数,找爷类,调用爷类构造函数



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()

"C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/Test/Test/test.py
这个是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
实验证明:
1、子类有构造函数,优先调用子类的构造函数
2、子类没构造函数,找父类,调用父类构造函数
3、子类没有构造函数,父类也没有构造函数,找爷类,调用爷类构造函数



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()

"C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/Test/Test/test.py
这个是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
实验证明:
如果在子类需要父类构造方法,不重写父类的构造方法。实例化子类时,会自动调用父类定义的 __init__;如果重写了__init__ 时,实例化子类,就不会调用父类已经定义的 __init__,要继承父类的构造方法,可以使用 super 关键字重写父类构造函数






class Father(object):
    def __init__(self, name):
        self.name = name
        print("父类构造函数name: %s" % (self.name))
    def getName(self):
        return 'Father ' + self.name
class Son(Father):
    def __init__(self, name,age):
        super(Son, self).__init__(name)#重写父类构造方法
        self.age=age
        print("子类构造函数name:%s 年龄:%s"%(self.name,self.age))
    def getName(self):
        print('子类方法')
if __name__ == '__main__':
    son = Son('runoob',30)
    son.getName()

"C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/Test/Test/test.py
父类构造函数name: runoob
子类构造函数name:runoob 年龄:30
子类方法

Process finished with exit code 0
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-31,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

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