zoukankan      html  css  js  c++  java
  • Python面向对象

    2019/08/27

    python面向对象

    类的继承

    一、什么是继承

    • 继承是一种新建类的方式,新建的类称为子类,被继承的类称为父类
    • 继承的特性是:子类会遗传父类的属性
    • 继承是类于类之间的关系

    二、为什么用继承

    • 使用继承可以减少代码的冗余

    三、对象的继承

    • python中支持一个类同时继承多个父类
    class Parent1:
        pass
    
    
    class Parent2:
        pass
    
    
    class Sub1(Parent1, Parent2):
        pass
    
    • 使用__bases__方法可以获取对象继承的类
    print(Sub1.__bases__)
    

    派生

    一、派生

    • 派生:子类中新定义的属性的这个过程叫做派生,并且需要记住子类在使用派生的属性时始终以自己的为准

    派生方法一(直接调用)

    • 指名道姓访问某一个类的函数:与继承无瓜
    class Person(object):
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
    
    # def init_1(self, name, age):
    #     self.name = name
    #     self.age = age
    
    
    class Student:
        school = 'yyyy'
    
        def __init__(self, name, age, course):
            # 指名道姓的使用Person的__init__方法
            Person.__init__(self,name,age)
            # init_1(self,name,age)
            self.course = course
    
    
    stu = Student('nick', 19, 'python')
    print(stu.name)
    print(stu.age)
    print(stu.course)
    
    
    Hugh
    19
    python
    
    

    派生方法二(super)

    • 严格依赖继承属性查找关系
    • super()会得到一个特殊的对象,该对象就是专门用来访问父类中的属性的(按照继承的关系)
    • super()._init_(不用为self传值)
    • super的完整用法是用super(自己的类名,self),在python2中需要些完整,而python3中可以简写为super()
    class Person(object):
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
    
    class Student(Person):
        school = 'yyyy'
    
        def __init__(self, name, age, course):
            # super()相当于得到了一个特殊对象,第一个参数不需要传,调用绑定方法,会把自己传过去
            ##########    self不需要传,不需要传
            # super().__init__(name,age)
            # 看到别人这么写:super(类名,对象)  在py3中为了兼容py2
            # 在py3中这么写和省略写法完全一样
            # 在py2中必须super(Student,self)写
            # super(Student,self).__init__(name,age)
            super().__init__(name, age)
            self.course = course
    
    
    stu = Student('Hugh', 19, 'python')
    print(stu.name)
    print(stu.age)
    print(stu.course)
    
    
    Hugh
    19
    python
    

    继承的菱形问题

    一、类的分类

    新式类

    • 继承object的类以及该类的子类,都是新式类
    • python3中所有的类都是新式类

    经典类

    • 没有继承object的类以及该类的子类,都是经典类
    • 只有python2中才有经典类

    二、菱形继承问题

    如果继承关系为菱形结构,即子类的父类最后继承了同一个类,那么属性的查找方式有两种:

    • 经典类下:深度优先
    • 广度优先:广度优先
    • 经典类:一条路走到黑,深度优先

    mro()方法

    F1 = F()
    print(F.mro())
    
    [<class '__main__.F'>, <class '__main__.D'>, <class '__main__.B'>, <class '__main__.E'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]
    
  • 相关阅读:
    多项式学习笔记(二) NTT
    矩阵树定理学习笔记
    拓展BSGS 学习笔记
    P2257 YY的GCD
    P1891 疯狂的lcm
    友链
    关于我
    焚燃指间の回忆
    洛谷P4180
    洛谷P2292
  • 原文地址:https://www.cnblogs.com/Wunsch/p/11419075.html
Copyright © 2011-2022 走看看