Python面向对象(五) 面向对象三大特性

Python面向对象(五) 面向对象三大特性,第1张

面向对象三大特性
  • 面向对象三大特性
    • 1. 封装
    • 2. 继承
    • 3.多态
    • 4.补充
    • 综合案例

面向对象三大特性 1. 封装

就是把文件封起来

好处:

1. 用起来更方便
2. 可以保证数据的安全
3. 利于代码维护
2. 继承

继承一些父类的非私有属性和方法,继承是使用,不是复制

分类:

单继承仅仅继承了一个父类

多继承继承了多个父类

继承下的影响

  • 资源的继承

    明确继承是指资源的使用权

    出来私有属性和方法,其他都能继承

  • 资源的使用

    1. 继承的几种形态 及该遵循的标准原则

      • 单继承链 从自己身上开始往上找

      • 无重叠的多继承链 按一条单继承链先自下往上找 类似于深度查找

      • 有重叠的多继承链 类似于宽度查找

    2. 针对几种标准原则的方案演化

      • Python2.2之前 仅仅存在经典类 MRO原则:深度优先(从左往右) 问题:“有重叠的多继承”中,违背“重写可用原则”

      • Python2.2 产生了新式类

        MRO原则:经典类:深度优先(从左往右)

        ​ 新式类:深度优先(从左到右)的算法基础上优化了:如果产生重复元素,会保留最后一个,并且,更尊重基类出现的先后顺序

        但不是广度优先算法

        问题:无法检测出有问题的继承

        ​ 有可能还会违背“局部优先”的原则

      • Python2.3-2.7 新式类经典类并存

        MRO原则:经典类:深度优先(从左到右)

        ​ 新式类:C3算法

        C3算法步骤:

      • Python3.x之后 都是新式类:C3算法

  • 资源的覆盖

  • 资源的累加

3.多态

多态:

  1. 一个类,所延伸的多种形态
  2. 调用时的多种形态

多态在Python中的体现:

​ 鸭子类型:动态类型的一种风格

​ 只在乎对象的“行为和属性”,不在不对象的类型

4.补充

抽象类:一个抽象出来的类,并不是某一个具化的类

​ 不能直接创建实例的类 创建会报错

抽象方法:一个抽象出来的方法

​ 不能具体实现 不能之际调用,子类不实现回报错

Python中的实现:无法直接支持,需要借助一个模块 import abc

​ 设置元类为 abc.ABCMeta

​ 使用装饰器修饰抽象方法@abc.abstractmethod

import abc

class Animal(object, metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def jiao(self):
        pass
    @abc.abstractclassmethod
    def test(cls):
        pass
class Dog(Animal):
    def jiao(self):
        print("汪汪汪")
    @classmethod
    def test(cls):
        print("xxx")
        pass
    pass
class Cat(Animal):
    def jiao(self):
        print("喵喵喵")
    @classmethod
    def test(cls):
        print("xxx")
        pass

def test(obj):
    obj.jiao()

# Animal()
d = Dog()
d.jiao()
c = Cat()
test(d)
综合案例
# 定义三个类,小狗,小猫,人
# 小狗:姓名,年龄(默认1岁):          吃饭,玩,睡觉,看家(格式:名字是xxx,年龄xx岁的小狗在xx)
# 小猫:姓名,年龄(默认1岁):          吃饭,玩,睡觉,捉老鼠(格式:名字是xxx,年龄xx岁的小猫在xx)
# 人:姓名,年龄(默认1岁),宠物:       吃饭,玩,睡觉,看家(格式:名字是xxx,年龄xx岁的人在xx)
#                                    养宠物(让所有的宠物吃饭,玩,睡觉)
#                                     让宠物工作(让所有的宠物根据自己的职责开始工作)

class Animal:
    def __init__(self, name, age=1):
        self.name = name
        self.age = age
    def eat(self):
        print("%s在吃饭"%self)

    def play(self):
        print("%s在玩"%self)

    def sleep(self):
        print("%s在睡觉"%self)
class Person(Animal):

    def __init__(self, name, pets, age=1):
        super(Person, self).__init__(name, age)
        self.pets = pets

    def yangPets(self):
        for pet in self.pets:
            pet.eat()
            pet.play()
            pet.sleep()
    def make_pets_work(self):
        for pet in self.pets:
            pet.work()
            # if isinstance(pet, Dog):
            #     pet.watch()
            # elif isinstance(pet, Cat):
            #     pet.catch()
    def __str__(self):
        return "名字是{},年龄{}岁的人".format(self.name,self.age)

class Cat(Animal):
    # 在创建一个小狗实例的时候,给它设置几个属性
    def __init__(self, name, age=1):
        self.name = name
        self.age = age

    def work(self):
        print("%s在捉老鼠"%self)
    def __str__(self):
        return "名字是{},年龄{}岁的小猫".format(self.name,self.age)

class Dog(Animal):
    # 在创建一个小狗实例的时候,给它设置几个属性
    def __init__(self, name, age=1):
        self.name = name
        self.age = age

    def work(self):
        print("%s在看家"%self)
    def __str__(self):
        return "名字是{},年龄{}岁的小狗".format(self.name,self.age)

d = Dog("小黑", 18)
c = Cat("小红", 2)
p = Person("sz", [d, c], 18)
p.yangPets()

p.make_pets_work()

# class Person:
#     # 在创建一个小狗实例的时候,给它设置几个属性
#     def __init__(self, name, pets, age=1):
#         self.name = name
#         self.age = age
#         self.pets = pets
#     def eat(self):
#         print("%s在吃饭"%self)
#
#     def play(self):
#         print("%s在玩"%self)
#     def sleep(self):
#         print("%s在睡觉"%self)
#     def yangPets(self):
#         for pet in self.pets:
#             pet.eat()
#             pet.play()
#             pet.sleep()
#     def make_pets_work(self):
#         for pet in self.pets:
#             pet.work()
#             # if isinstance(pet, Dog):
#             #     pet.watch()
#             # elif isinstance(pet, Cat):
#             #     pet.catch()
#     def __str__(self):
#         return "名字是{},年龄{}岁的人".format(self.name,self.age)
#
# class Cat:
#     # 在创建一个小狗实例的时候,给它设置几个属性
#     def __init__(self, name, age=1):
#         self.name = name
#         self.age = age
#     def eat(self):
#         print("%s在吃饭"%self)
#
#     def play(self):
#         print("%s在玩"%self)
#
#     def sleep(self):
#         print("%s在睡觉"%self)
#
#     def work(self):
#         print("%s在捉老鼠"%self)
#     def __str__(self):
#         return "名字是{},年龄{}岁的小猫".format(self.name,self.age)
#
# class Dog:
#     # 在创建一个小狗实例的时候,给它设置几个属性
#     def __init__(self, name, age=1):
#         self.name = name
#         self.age = age
#     def eat(self):
#         print("%s在吃饭"%self)
#
#     def play(self):
#         print("%s在玩"%self)
#
#     def sleep(self):
#         print("%s在睡觉"%self)
#
#     def work(self):
#         print("%s在看家"%self)
#     def __str__(self):
#         return "名字是{},年龄{}岁的小狗".format(self.name,self.age)
#
# d = Dog("小黑", 18)
# c = Cat("小红", 2)
# p = Person("sz", [d, c], 18)
# p.yangPets()
#
# p.make_pets_work()

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/786972.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-05
下一篇 2022-05-05

发表评论

登录后才能评论

评论列表(0条)

保存