【python】面向对象初识之继承

#面向对象的三大特性:继承   多态   封装

 

class Animal:

    breath = '呼吸'

 

    def __init__(self, name, sex, age):

        self.name = name

        self.sex = sex

        self.age = age

 

    def eat(self):

        print('动物都需要进食....')

 

class Person(Animal):  # 括号里面的Animal是Person的父类,基类,超类   括号外面的Person是子类,派生类.

  pass

 

# 初识继承:子类以及子类实例化的对象 可以访问父类的任何方法或变量.

# 类名可以访问父类所有内容

print(Person.breath)

Person.eat(111)

#子类实例化的对象也可以访问父类所有内容

p1=Person('alex','mal',20)

print(p1.breath)

p1.eat()

 

 

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 '绿翅膀'

        #方法一:

        Animal.__init__(self, name, sex, age)  #类名调用方法,这几个参数是实参,执行Anilmal中共有属性

        self.wing = wing  #执行Bird中特有属性

        #方法二:

        super().__init__(name,sex,age)  #  super(Brid,self).__init__(name,sex,age)

        self.wing = wing

 

    def eat(self,argv):

        super().eat(argv)

        print('鸟吃虫子...')

 

b1 = Brid("鹦鹉","公",20,"绿翅膀")

print(b1.__dict__)

b1.eat("金蝉") 

"""

鹦鹉吃金蝉

鸟吃虫子...

"""

总结:

只执行父类的方法:子类中不要定义与父类同名的方法

只执行子类的方法:在子类创建这个方法.

# 既要执行子类的方法,又要执行父类的方法:

"""

方法一:

class Brid(Animal):

    def __init__(self, name,sex,age,wing): 

     Animal.__init__(self, name, sex, age)

self.wing = wing 

 

"""

"""

方法二:(常用)

class Brid(Animal):

    def __init__(self, name,sex,age,wing):

        super().__init__(name,sex,age)  #super(Brid,self).__init__(name,sex,age)

        self.wing = wing  

#super()作用:为了在子类中调用父类的方法,自动执行父类__init__,并将__init__()中的参数传给子类,除self不会传入

 

"""

 

 

继承: 单继承,多继承

#单继承: 新式类,经典类查询顺序一样.

#多继承:

    #  新式类: 遵循广度优先. 一条路走到倒数第二级,判断,如果其他路能走到终点,则返回走另一条路.如果不能,则走到终点

  # mro方法查看继承顺序

       # py3 默认继承object  所以py3都是新式类

       # super().func() 遵循mro算法,在类的内部不用传子类名和self

      # py2 需要主动继承object

      # super(子类名,self).func() 必须传子类名和self

 

    #  经典类: 遵循深度优先. 一条路走到底.

  # py2 不继承object,默认都是经典类

       # 没有mro

有关深度优先和广度优先在继承两个类情况下是严格遵循的

 

继承好处:

1、优化代码 节省代码

2、提高代码复用性

3、提高代码维护性

4、让类与类之间发生联系

 

 

例子:

【python】面向对象初识之继承_第1张图片

 

 

b = B()

b.func()    #打印的是A B  

#方法:画继承图,如果是多继承,根据MRO方法找顺序

 

你可能感兴趣的:(【python】面向对象初识之继承)