类的继承
继承的优点:
1,节省代码.
2,规范代码.
初识继承:
#执行方法的时候先在自己的类中找,没有再去父类中找
只执行本类的方法 #在本类中要有执行的方法
只执行父类的方法. #本类中不写这个方法,自动去找父类中的方法
既执行本类又执行父类的方法
1,父类名.方法名(参数)
2,super().方法名(参数(self自动传值,不用写self))
举例:
class
Animal:
def
__init__(
self
, name, sex, age):
self
.name
=
name
self
.sex
=
sex
self
.age
=
age
def
eat(
self
,a1):
print
(
'%s吃%s'
%
(
self
.name,a1))
def
drink(
self
):
print
(
'%s喝东西'
%
(
self
.name))
class
Cat(Animal):
def
miaow(
self
):
print
(
'喵喵叫'
)
# def eat(self): # 只执行自己类中的方法
# print(666)
class
Brid(Animal):
def
__init__(
self
, name,sex,age,wing):
# self b1对象 name '鹦鹉',sex '公',age 20, wing '绿翅膀'
'''
self=b1对象
name='鹦鹉'
sex='公'
age= 20,
wing='绿翅膀'
'''
#1, Animal.__init__(self, name, sex, age)
#2, super().__init__(name,sex,age) # 相当于super(Brid,self).__init__(name,sex,age)
self
.wing
=
wing
def
bark (
self
):
print
(
'嗷嗷叫'
)
def
eat(
self
,argv):
super
().eat(argv)
print
(
'鸟吃虫子...'
)
class
Chook(Animal):
def
crow(
self
):
print
(
'大爷laiwanya'
)
cat1
=
Cat(
'tom'
,
'公'
,
3
)
cat1.eat()
# 只执行父类的方法:子类中不要定义与父类同名的方法
# 只执行子类的方法:在子类创建这个方法.
# 既要执行子类的方法,又要执行父类的方法?
# 有两种解决方法.
# 1,Animal.__init__(self, name, sex, age)
# 1,super().__init__(name,sex,age)
# cat1 = Cat('tom','公', 3,)
b1
=
Brid(
'鹦鹉'
,
'公'
,
20
,
'绿翅膀'
)
# print(b1.__dict__)
b1.eat(
'金蝉'
)
单继承,多继承.
类:新式类,经典类.
单继承;
新式类经典类一样.
class
A:
pass
# def func(self):
# print('IN A')
class
B(A):
pass
# def func(self):
# print('IN B')
class
C(B):
pass
# def func(self):
# print('IN C')
c1
=
C()
c1.func()
多继承: #python3中没有经典类,都是新式类,自动继承object类.
新式类:广度优先 类名.mro()#查询类的继承顺序
经典类:深度优先. #python2中才有经典类,继承object类之后就是新式类
新式类:广度优先 类名.mro()#查询类的继承顺序
经典类:深度优先. #python2中才有经典类,继承object类之后就是新式类
class
A:
def
func(
self
):
print
(
'IN A'
)
class
B(A):
pass
# def func(self):
# print('IN B')
class
C(A):
pass
# def func(self):
# print('IN C')
class
D(B):
pass
# def func(self):
# print('IN D')
class
E(C):
pass
# def func(self):
# print('IN E')
class
F(D,E):
pass
# def func(self):
# print('IN F')
f1
=
F()
f1.func()
print
(F.mro())
# 查询类的继承顺序
#F,D,B,E,C,A
#先写出所有路的继承顺序,D,B,A E,C,A在写出继承的顺序D,E
#以每一条路的第一位为头,后面的为尾
#判断第一条路的头在不在后面的尾里面
#如果在
#看另一条路的头在不在
#如果不在
#删除每一条路的这个字母
#添加到另一个列表中
#依次循环
#得到的那个新列表前面加上最后的那个子类名
#就是继承的顺序