您的位置:首页 >聚焦 >

Python类的继承

2022-04-24 22:04:03    来源:程序员客栈

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

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

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

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

class Person(object):name="Person类name"age="Person类的age"def __init__(self,name,age):self.name=nameself.age=ageprint("这里是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=nameself.age=ageprint("这里是Person类的构造方法")class Teacher(Person):name="Teacher类的name"def __init__(self,age):self.age=ageprint("这里是Teacher类的构造方法")test = Teacher(20)print(test.name,Teacher.name)print(test.age,Teacher.age)这里是Teacher类的构造方法Teacher类的name Teacher类的name20Person类的ageProcess finished with exit code 0

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

class Person(object):name = "Person类name"age = "Person类的age"def __init__(self,name,age):self.name=nameself.age=ageprint("这里是Person类的构造方法")class Teacher(Person):name="Teacher类的name"a=111test = Teacher("橙子",30)print(test.name,test.a,Teacher.name)print(test.age,Teacher.age)这里是Person类的构造方法橙子 111 Teacher类的name30Person类的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=nameself.age=ageprint(self.name)print("这里是Person类的构造方法")class Teacher(Person):def __init__(self,name,age,sex):super(Teacher,self).__init__(name,age)print("这里是Teacher类的构造方法")self.sex=sextest=Teacher("橙子",11,"男")print(test.name,test.age,test.sex)橙子这里是Person类的构造方法这里是Teacher类的构造方法橙子11男Process finished with exit code 0

关键词: 构造方法 构造函数 多重继承

相关阅读