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

多态与多态性

# 多态:一种事物的多种形态
水:固态水,液态水, 气态水

动物:人,猪,
# 继承, 子类使用父类的属性
多态类中的继承:不是让子类遗传父类的属性

多态带来的特性:在不考虑对象的数据类型的情况下,直接调用方法

 

posted @ 2021-08-27 20:36  一叶松  阅读(191)  评论(0编辑  收藏  举报