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'>]
原文地址:https://www.cnblogs.com/Wunsch/p/11419075.html