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'>]