继承:单继承,多继承
类:经典类,新式类
新式类:凡是继承object类的都是新式类
- python3x 所有的类都是新式类,因为py3中的类都默认继承object
经典类:不继承object类都是经典类
- python2x(既有新式类,又有经典类)所有的类默认都不继承object类,所有的类默认都是经典类,你可以让其继承object
单继承:新式类,经典类查询顺序一样
class A:
def func(self):
print("IN A")
class B:
pass
#def func(self):
#print("IN B")
class C:
pass
#def func(self):
#print("IN C")
c1 = C()
c1.func()
多继承:
- 新式类:查询顺序遵循广度优先
- 经典类:查询顺序遵循深度优先
- 深度优先,广度优先的前提:只能是继承两个类的情况
多继承的新式类 广度优先:一条路走到倒数第二级,如果其他路能走到终点,则返回走另一条路,如果不能,则走到终点
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 C")
class E(C):
pass
# def func(self):
# print("IN C")
class F(D,E):
pass
# def func(self):
# print("IN C")
#多继承的经典类:深度优先 : 一条路走到底
# f1 = F()
# f1.func()
print(F.mro()) #查询类的查询顺序
广度优先,每个节点有且只走一次
多继承的经典类,会一条路走到底。
继承的优点:
- 节省代码
- 规范代码
- 提高代码的复用性,维护性
为什么使用继承?
让类与类之间发生关系
继承关系中执行方法:
- 只执行父类的方法:子类中不要定义与父类同名的方法
- 只执行子类的方法:在子类中创建这个方法
- 既要执行子类的方法,又要执行父类的方法:
1、父类名.方法名(参数)
2、super()._init_(name,sex,age) 自动执行父类的__init__,除了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))
class Bird(Animal):
def __init__(self,name,sex,age,wing):
super().__init__(self,name,sex,age,wing)
self.wing = wing
def eat(self,argv):
super().eat(argv)
print("吃虫子")
b1 = Bird('鹦鹉',20,'公','绿翅膀')
b1.eat('金蝉')