面向对象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()

多继承下的属性查找

# 经典类中属性查找按照   深度优先查询



面向对象2


# 新式类中属性查找按照   广度优先查询
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()


面向对象2

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__)

多态与多态性

# 多态:一种事物的多种形态
水:固态水,液态水, 气态水
?
动物:人,猪,
# 继承, 子类使用父类的属性
多态类中的继承:不是让子类遗传父类的属性
?
多态带来的特性:在不考虑对象的数据类型的情况下,直接调用方法

 

面向对象2

上一篇:软件测试,2021最新大厂251道面试题,看完让你offer拿到手软


下一篇:Markdown学习