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())


原文地址:https://www.cnblogs.com/lhy979/p/9368537.html