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