面向对象2
面向对象
-
面向对象的三大特征
封装
继承
多态
-
继承的属性查找
-
单继承下的属性查找
-
多继承下的属性查找
-
-
super()和mro()
-
多态与多态性
-
组合
继承
# 1.什么是继承?
继承就是新建类的一种方式,新建出来的类我们称为子类或者叫派生类,被继承的类称为父类或者基类
# 子类可以遗传父类的属性
# 2. 为什么要用继承?
类解决的是对象与对象之间的代码冗余问题
继承解决类与类之间的代码冗余问题
# 3. 如何使用继承?
新式类:继承了object类的子子孙孙类都是新式类
经典类:不继承object类的子子孙孙类都是经典类
# 新式类和经典类只在python2中区分
在python3中都是新式类
"""
学会子类如何使用父类的属性
1. 指名道姓:People.__init__(self, name, age, gender)
2. super():
"""
class People():
school = 'SH'
def __init__(self, name, age, gender):
# self => stu
self.name = name
self.age = age
self.gender = gender
class Student(People):
def __init__(self, name, age, gender, course=None):
if course is None:
course = []
self.courses = course
# self => stu
People.__init__(self, name, age, gender) # 普通方法, 指名道姓的调用方法
def choose_course(self, course):
# stu_dic['course'].append(course)
# stu_obj['course'].append(course)
# stu_obj.courses.append(course)
# self.courses.append(course)
self.courses.append(course)
print("%s选课成功%s" % (self.name, self.courses))
stu = Student('egon', 19, 'male') # Student(stu, 'egon', 19, 'male')
单继承下的属性查找
# class Foo:
# def f1(self):
# print("Foo.f1")
#
# def f2(self):
# print("Foo.f2")
# self.f1() # self => obj
#
#
# class Bar(Foo):
# def f1(self):
# print("Bar.f1")
#
#
# obj = Bar()
# obj.f2()
class Foo:
def __f1(self): # def _Foo__f1()
print("Foo.f1")
def f2(self):
print("Foo.f2")
self.__f1() # self._Foo__f1()
class Bar(Foo):
def __f1(self): # def _Bar__f1()
print("Bar.f1")
obj = Bar()
obj.f2()
多继承下的属性查找
# 经典类中属性查找按照 深度优先查询
# 新式类中属性查找按照 广度优先查询
class G(object):
# def test(self):
# print('from G')
pass
class F(G):
# def test(self):
# print('from F')
pass
class C(F):
# def test(self):
# print('from C')
pass
class D(G):
# def test(self):
# print('from D')
pass
class E(G):
# def test(self):
# print('from E')
pass
class H():
def test(self):
print('from H')
pass
class B(E, H):
# def test(self):
# print('from B')
pass
class A(B, C, D):
# def test(self):
# print('from A')
pass
f1 = A()
f1.test()
super()和mro()
class A:
def test(self):
print('A---->test')
super().aaa()
class B:
def test(self):
print('B---->test')
def aaa(self):
print('B---->aaa')
class C(A, B):
def aaa(self):
print('C----->aaa')
# c = C()
# c.test() # 打印结果:
# print(C.__mro__)
a = A()
# a.test()
print(A.__mro__)
多态与多态性
# 多态:一种事物的多种形态
水:固态水,液态水, 气态水
动物:人,猪, 狗
# 继承, 子类使用父类的属性
多态类中的继承:不是让子类遗传父类的属性
多态带来的特性:在不考虑对象的数据类型的情况下,直接调用方法