zoukankan      html  css  js  c++  java
  • 【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、让类与类之间发生联系

    例子:

    b = B()

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

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

  • 相关阅读:
    Struts 2
    spring中的发布订阅
    win10 安装mysql5.7.36
    Spring Boot如何使用HikariCP连接池详解
    ascii 和 byte以及UTF-8的转码规则
    计算机基础之 二进制与十进制
    VMWare VMNet 8 的配置使用
    IDEA中运行kotlin程序报错:Cannot inline bytecode built with JVM target 1.8 into bytecode that is being built with JVM target 1.6
    在Kotlin中使用Kotlin/java注解及注意事项
    关于Vue2.0,Express实现的简单跨域
  • 原文地址:https://www.cnblogs.com/xlzhangq/p/13211247.html
Copyright © 2011-2022 走看看