zoukankan      html  css  js  c++  java
  • python 继承

    一、简介

    1、作用

    简化代码

    2、分类

    一个父类可以被多个多个子类继承

    一个子类可以继承多个父类---python独有

    3、新式类和经典类

    python3中,只含义新式类,新式类默认继承Object

    python2.7中含义经典类和新式类,新式类需要继承Object

    4、方法

    类名.__base__查看该类的继承顺序

    类.mro(),返回类的调用顺序

    class A:
        print('A')
    
    
    class B(A):
        print('B')
    
    
    class C(A):
        print('C')
    
    
    class D(B, C):
        print('D')
    
    
    print(D.__bases__)      # (<class '__main__.B'>, <class '__main__.C'>)
    print(D.mro())      # [<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]

    二、单继承

    1、派生

    派生属性:在子类中,创建父类中没有的属性

    派生方法:在子类中,创建父类中没有的方法

    2、顺序

    1)子类对象的调用顺序

    子类属性、方法,若没有到父类的属性、方法,若没有到Object,若没有,则报错

    2)调用父类

    1)通过子类对象调用,若子类有同名方法,会调用子类的方法

    2)通过父类名直接调用父类

    3)使用super(类名, 已定义的对象名).类方法名

    3、用父类的属性、方法

    1)父类名.__init__(self, 父类的其它属性)

    2)super().__init__(父类的其它属性)

    4、super()

    super()方法只在python3中存在

    在类内部可以不写()内的类名和对象名

    super()的本质:不是单纯找父类,而是根据调用者的节点位置的广度优先顺序来的

    class Person:
        def __init__(self, name, sex, age):
            self.name = name
            self.sex = sex
            self.age = age
    
        def introduce(self):
            print('父类方法', self.name)
    
    
    class Student(Person):
        def __init__(self, name, sex, age, grade):
            Person.__init__(self, name, sex, age)       # 通过父类直接调用__init__方法
            self.grade = grade      # 派生属性
    
        def gr(self):       # 派生方法
            print(self.grade)
    
    
    class Worker(Person):
        def __init__(self, name, sex, age, money):
            super(Worker, self).__init__(name, sex, age)    # Worker, self 可以不写
            self.money = money      # 派生属性
    
        def make(self):     # 派生方法
            print(self.money)
    
    
    s1 = Student('tom', 'man', 24, 99)
    s1.gr()     # 99
    print(s1.name)      # tom
    s1.introduce()      # 父类方法 tom, 调用父类方法,若子类有同名方法,会调用子类的方法
    Person.introduce(s1)    # 调用父类方法
    super(Student, s1).introduce()  # 调用父类方法

    三、多继承

    1、一个子类继承多个父类

    2、调用顺序

    默认是就近原则

    新式类:广度优先

    经典类:深度优先

    3、新式类

    1)钻石继承

    class D:
        print('D')
    
    
    class B(D):
        print('B')
        
        
    class C(D):
        print('D')
        
        
    class A(B, C):
        print('A')

    2)

    3)

     4、经典类

    深度优先,一条路走到黑

     ps:组合和继承怎么抉择?

      组合:什么有什么

      继承:什么是什么

  • 相关阅读:
    穷举
    菱形
    docker安装cloudera manager,切换cloudera-scm用户报错can not open session
    修改cloudera manager的端口号
    postgresql拓展if、ifnull、group_concat函数
    clion调试postgresql
    Java面向切面原理与实践
    Spring-boot非Mock测试MVC,调试启动tomcat容器
    spring-cloud-feign 使用@RequetParam报错QueryMap parameter must be a Map: class java.lang.String
    linux虚拟机拓展大小
  • 原文地址:https://www.cnblogs.com/wt7018/p/10923175.html
Copyright © 2011-2022 走看看