面向对象--下

一、继承的简介

class Doctor():

    def study(self):
        print('救死扶伤')


class Soldier():

    def study(self):
        print('保卫国家')


class Person():
    name = ''
    age = ''

如何将以上三个类联系起来,我们引入继承的概念。

二、继承的引入

  • 继承是面向对象的三大特性之一。
  • 通过继承我们可以从一个类回去其他类中的属性方法。
  • 在定义类时,可以在类名后面的括号里指定当前类的父类(超类、基类)。
  • 继承提高了类的复用性,让类与类之间产生了关系。有了这个关系,才有了多态的特性。

继承的演示示例1:

class Animal(object):
    def sleep(self):
        print('动物会睡觉')

    def run(self):
        print('动物会跑')


# 定义一个狗类:
# 1.在动物类上面进行修改,添加狗的特性:这样修改起来不比较麻烦,违反了OCP原则。
# 2.创建一个新的狗类:创建比较麻烦。会出现代码的重复。

class Dog(Animal):
    def sleep(self):
        print('狗会睡觉')

    def run(self):
        print('狗会跑')

    def speak(self):
        print('汪汪汪')
# 思路三:直接从animal类中继承他的属性与方法。
# class Dog(Animal):
    # pass


dog = Dog()
dog.run()
dog.sleep()

打印输出结果:
动物会跑
动物会睡觉

继承的演示示例2:

class Animal(object):
    def sleep(self):
        print('动物会睡觉')

    def run(self):
        print('动物会跑')


# 定义一个狗类:
# 1.在动物类上面进行修改,添加狗的特性:这样修改起来不比较麻烦,违反了OCP原则。
# 2.创建一个新的狗类:创建比较麻烦。会出现代码的重复。

# 思路三:直接从animal类中继承他的属性与方法。
class Dog(Animal):
    pass


dog = Dog()
dog.run()
dog.sleep()

打印输出结果:
动物会跑
动物会睡觉
总结:如果父类与子类中有相同的方法,那么调用就会先调用子类的方法,子类没有在调用父类的方法。都没有就报错。

三、方法的重写

  • 方法的重写:如果在子类和父类中有同名的方法,则通过子类实例去调用方法时,会调用子类方法而不是父类方法,这个特点我们称之为方法的重写(覆盖)。
    实例演示:
class Yi(object):
    def test(self):
        print('这是第Yi个类')


class Er(Yi):
    def test(self):
        print('这是第Er个类')


class San(Er):
    def test(self):
        print('这是第San个类')


er = Er()
er.test()

打印输出结果:
这是第Er个类

  • 总结:
  • 1.当我们调用一个对象的方法时,会先优先去当前对象中寻找是否具有该方法,如果有则直接调用,
  • 2.如果没有,则去当前对象的父类中寻找,如果父类中有则直接调用父类中的方法。
  • 3.如果没有,则去父类中的父类去寻找,以此类推,知道找到object,如果还是没有则直接报错。

四、super()方法

  • super方法的作用:可以让我们重写父类的方法后,再去调用原有的父类的方法。
    示例演示:
    无参数
class Animal(object):
    name = '动物'

    def sleep(self):
        print('动物会睡觉')

    def run(self):
        print('动物会跑')


class Dog(Animal):
    def sleep(self):
        print('狗会睡觉')
        # Animal.sleep(self)
        super(Dog, self).sleep() # python 2的写法
        super().sleep() # python 3的写法

    def run(self):
        print('狗会跑')

    def speak(self):
        print('汪汪汪')


dog = Dog()
dog.sleep()

打印输出结果:
狗会睡觉
动物会睡觉
动物会睡觉
总结:
使用方法分为两种,分别是python2写法、python3写法
super(Dog, self).sleep() ----python2写法不建议使用
super().sleep() ----python3写法
演示实例2:
有参数

# 有参数init方法(必须了解)
class Animal(object):
    # init方法必须传入参数
    def __init__(self, name, age):
        self.name = name
        self.age = age
        print('动物')

    def sleep(self):
        print('动物会睡觉')

    def run(self):
        print('动物会跑')


class Dog(Animal):
    # 方法的重写:
    # init父类传入参数的同时,子类中init方法也需要传入参数
    # 重点理解
    def __init__(self, name, age):
        self.name = name
        self.age = age
        # 在init方法中传入参数的同时,super方法也许要传入参数。(二者同时使用时!)
        super().__init__(self.name, self.age)
        print('狗')

    def sleep(self):
        print('狗会睡觉')
        # Animal.sleep(self)
        # super(Dog, self).sleep(self.name, self.age) # python 2的写法
        super().sleep() # python 3的写法

    def run(self):
        print('狗会跑')

    def speak(self):
        print('汪汪汪')


dog = Dog('猫', 10)
# dog.sleep()

打印输出结果:
动物

五、多重继承

  • 在python中时支持多重继承的,也是我们可以为一个类同时指定多个父类。
  • 可以在类名的括号内部添加多个父类,来实现多重继承。
  • 多重继承,会使子类同时拥有多个父类,并且会回去所哟有父类的方法。
  • 在开发中没有特殊情况,应该尽量避免适应多重继承,因为多重继承会使我们的代码更加的复杂。
  • 如果多个父类有同名的办法,则会在第一个父类中寻找,然后时第二个、第三个。前面的会覆盖后面的。

# 演示示例1:
class A(object):

    def text(self):
        print('这是A类')


class B(object):

    def test(self):
        print('这是B类')


class C(A, B):
    pass


c = C()
c.test()



# 演示示例2:
class A(object):
    def text(self):
        print('这是A类')


class B(object):

    def test(self):
        print('这是B类')


class C(A, B):
    pass


c = C()
c.text()


# 演示示例3:
class A(object):

    def text(self):
        print('这是A类')


class B(object):

    def test(self):
        print('这是B类')


class C(A, B):
    pass


c = C()
c.text()
c.test()


# 演示示例4:
class A(object):
    def test(self):
        print('这是A类')


class B(object):

    def test(self):
        print('这是B类')


class C(A, B):
    pass


c = C()
c.test()
# 获取C所有父类的方法
print(C.__bases__)
# 打印输出结果:(<class '__main__.A'>, <class '__main__.B'>)

上述代码为多重继承的一些相关实例。
打印输出结果:
这是B类
这是A类
这是A类
这是B类
这是A类
(<class ‘main.A’>, <class ‘main.B’>)

拓展:解耦合

  • 提高问题的解决概率。
  • 提高问题的解决效果。
  • 提高解决问题的解决办法。
  • 降低将来爆发隐患的可能性。

六、多态

  • 多态是面向对象的三大特性之一。
  • 多态的概念:一个对象可以以不同的形态去展示。
  • 多态的有特点:
    • 1、只关心对象的实例方法是否同名,不关心对象的所属类型。
    • 2、对象所属类之间,继承关系可有可无。
    • 3、多态的好处是可以增加代码外部调用灵活度,让代码更加通用,兼容性比较强。
    • 4、多态是态哦用方法的技巧,不会影响到类的内部设计。
      演示实例:
class A(object):

    def __init__(self, name):
        self._name = name
    # property装饰器(封装、查看属性)
    @property
    def name(self):
        return self._name

    @name.setter # 封装修改属性
    def name(self, name):
        self._name = name


class B(object):
    def __init__(self, name):
        self._name = name
    # property装饰器(封装、查看属性)
    @property
    def name(self):
        return self._name

    @name.setter # 封装修改属性
    def name(self, name):
        self._name = name

# 添加属性并对属性进行赋值
a = A('刘亦菲')
b = B('周慧敏')
# 外部定义函数,与类相互使用
def speak(obj):
    print('大家好,我是%s' % obj.name)
# 调用函数
speak(a)
speak(b)

打印输出结果:
大家好,我是刘亦菲
大家好,我是周慧敏
总结:
具有不同的功能的函数可以使用相同的函数名,调用不同的内容出来。
特性:
类与函数结合使用,产生不同的结果。

无继承关系实例演示:

class Duck(object):
    def fly(self):
        print('鸭子沿着水面飞起来了')


class Swan(object):
    def fly(self):
        print('天鹅在天空中翱翔')


class Plane(object):
    def fly(self):
        print('飞机在天空做着眼镜蛇机动')


def fly(obj):
    obj.fly()


duck = Duck()
fly(duck)
swan = Swan()
fly(swan)
plane = Plane()
fly(plane)

打印输出结果:
鸭子沿着水面飞起来了
天鹅在天空中翱翔
飞机在天空做着眼镜蛇机动

有继承关系实例演示:

class Grandpa(object):
    def __init__(self, money):
        self.money = money

    def p(self):
        print('这是爷爷')


class Father(Grandpa):
    def __init__(self, money, job):
        super().__init__(money)
        self.job = job

    def p(self):
        print('这是父亲,我重写了爷爷的方法')


class Mother(Grandpa):
    def __init__(self, money, job):
        super().__init__(money)
        self.job = job

    def p(self):
        print('这是母亲,我重写了爷爷的方法')


def fn(obj):
    obj.p()

grandpa = Grandpa(5000)

father = Father(4000, '教授')

mother = Mother(3500, '博士后')

fn(grandpa)
fn(father)
fn(mother)

打印输出结果:
这是爷爷
这是父亲,我重写了爷爷的方法
这是母亲,我重写了爷爷的方法

有继承关系代码不全,请谅解!

猜你喜欢

转载自blog.csdn.net/Rhymeplot__JDQS/article/details/109174555