20180725 (面向对象的继承)
面向对象的三大特性:继承,多态,封装
一.初识继承 (子类以及子类实例化的对象,可以访问父类的任何方法和静态变量)
1.最简单的继承例子
例如:
class Animal:
breath = "会呼吸"
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex
def eat(self):
print("可以吃")
class Person(Animal): ======>(括号里面的是父类,基类或者超类) 括号外面的是子类,派生类
p1 = Person("alex",29,"男")
类名可以访问父类中的所有内容
print(Person.breath) ====>会呼吸
Person.eat(111) =====> 可以吃
子类实例化的对象可以访问父类所有内容
print(p1.breath) =====>会呼吸
p1.eat() ======>可以吃
2.查询顺序
类名.属性():先从本类空间找,如果找不到,就从父类找
对象.属性():先从对象空间找,如果找不到,到类空间找,如果找不到,就到父类找
3.只执行父类的方法: 子类中不要定义与父类同名的方法
例如:
class Animal:
breath = "会呼吸"
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex
def eat(self):
print("可以吃")
class Person(Animal):
pass
p1 = Person("alex",29,"男")
p1.eat(1)
只执行子类的方法: 在子类中创建这个方法
例如:
class Animal:
breath = "会呼吸"
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex
class Person(Animal):
def eat(self):
print("可以吃")
p1 = Person("alex",29,"男")
p1.eat()
既要执行本类的方法,又要执行父类的方法
方法一:
class Animal:
def __init__(self,name,sex,age):
self.name = name
self.sex = sex
self.age = age
class Bird(Animal):
def __init__(self,name,sex,age,wing):
Animal.__init__(self,name,sex,age) =====>调用父类,然后自动执行父类中的__init__ 然后封装下面三个属性
self.wing = wing
b1 = Bird("鹦鹉","公",2,"绿色")
print(b1.__dict__)
方法二:
class Animal:
def __init__(self,name,sex,age):
self.name = name
self.sex = sex
self.age = age
class Bird(Animal):
def __init__(self,name,sex,age,wing):
super().__init__(name,sex,age) == super(Bird,self).__init__(name,sex,age) super会自动执行父类中的__init__ 将b1的实例化对象传给self
self.wing = wing
b1 = Bird("鹦鹉","公",2,"绿色")
print(b1.__dict__)
二.继承的进阶
1.类:经典类 和 新式类
新式类:凡是继承object类都是新式类 (python3x 中所有的类都是新式类,因为python3x 中的类都默认继承object)
经典类:不继承object类的都是经典类(python2x 中所有的类默认都不继承object类.所有的类默认都是经典类)
class A(boject): 可以让其继承object
2.继承:单继承:新式类,经典类查询顺序一样
多继承:新式类:遵循广度优先
经典类:遵循深度优先
多继承的新式类(广度优先):
class A:
def func(self):
print("IN A")
class B(A):
def func(self):
print("IN B")
class C(A):
def func(self):
print("IN C")
class D(B):
def func(self):
print("IN D")
class E(C):
def func(self):
print("IN E")
class F(D,E):
def func(self):
print("IN F")
f1 = F()
f1.func()
多继承的经典类(深度优先):
多继承原理C3算法
例如:
class H:
def bar(self):
print('F.bar')
class G(H):
def bar(self):
print('F.bar')
class F(H):
def bar(self):
print('F.bar')
class E(G):
def bar(self):
print('E.bar')
class D(F):
def bar(self):
print('D.bar')
class C(E):
def bar(self):
print('C.bar')
class B(D):
def bar(self):
print('B.bar')
class A(B, C, D):
def bar(self):
print('A.bar')
a = A()
print(A.mro())