zoukankan      html  css  js  c++  java
  • Python 面向对象--继承,实现,依赖,关联,聚合,组合

    一. 继承

    继承指的是子类继承父类除私有内容以外的其他所有内容, 并且子类具有增加自己新内容的能力.

    举例说明:

    class Animal:
      print("吃是动物的本能")
    
    class Cat(Animal):
      def cat_eat(self):
        print("猫儿优雅地吃东西")
    
    c = Cat()
    c.cat_eat()
    
    # 以上代码执行结果:
    # 吃是动物的本能
    # 猫儿优雅地吃东西

    二. 接口实现(约束)

    接口是一种数据类型,主要用于约束派生类中必须实现指定的方法,它存在于java和c#中.

    Python中没有接口,但它有两种方式来进行约束: 

    1. 用普通类抛异常的方式进行约束(推荐)

    举例说明:

    class Animal:    # 父类Animal具有约束作用, 子类必须对父类的方法进行重写,否则抛出异常
        def eat(self):
         raise NotImplementedError("eat()方法必须被重写!")
        def sleep(self): pass
            raise NotImplementedError("sleep()方法必须被重写!")
    
    class Dog(Animal):
        def eat(self):
            print("狗吃狗粮")
        def sleep(self):
            print("狗趴着睡")
    
    class Cat:
        def eat(self):
            print("猫吃猫粮")
        def sleep(self):
            print("猫躺着睡")
    
    dog = Dog()
    dog.eat()
    
    cat = Cat()
    cat.sleep()

    2. 用抽象类和抽象方法进行约束(不推荐)

    举例说明:

    from abc import ABCMeta, abstractmethod
    
    class Animal(metaclass=ABCMeta):  # 表示抽象类
        @abstractmethod  # 加装饰器
        def eat(self): pass
    
    class Dog(Animal):
        def eat(self):
            print("狗吃狗粮")
    
    class Cat:
        def eat(self):
            print("猫吃猫粮")
    
    dog = Dog()
    dog.eat()
    
    cat = Cat()
    cat.eat()            

    三. 依赖

    可以简单的理解, 就是一个类 A 使用到了另一个类 B, 而这种使用关系是具有偶然性的,临时性的 非常弱的,  但是 B 类的变化会影响到 A. 比如某人要过河,需要借用一条船,此时人与船之间的关系就是依赖. 表现在代码层面为: 类 B 作为参数被类 A 在某个method 方法中使用.

    举例说明:

    class Person:
        def __init__(self, name):
            self.name = name
        def call_up(self, cellphone):
            print("%s正在使用%s打电话" % (self.name, cellphone.name))
            cellphone.call()
    
    class Cellphone:
        def __init__(self, name):
            self.name = name
        def call(self):
            print("%s正在为您呼叫" % self.name)
    
    person = Person("王乃卉")
    cellphone = Cellphone("iPhoneX")
    
    person.call_up(cellphone)
    
    # 以上代码执行结果是:
    # 王乃卉正在使用iPhoneX打电话
    # iPhoneX正在为您呼叫

    四. 关联

    关联体现的是两个类, 或者类与接口之间语义级别的一种强依赖关系.
    比如我和我的朋友, 这种关系比依赖更强, 不存在依赖关系的偶然性, 关系也不是临时性的, 一般是长期性的, 而且双方的关系一般是平等的, 关联可以是单向,双向的.
    表现在代码层面为: 被关联类 B 以类属性的形式出现在关联类 A 中, 也可能是关联类 A 引用了一个类型为被关联类 B 的全局变量.

    1. 聚合

    聚合是关联关系的一种特例, 它体现的是整体与部分,拥有的关系, 即 has-a 的关系. 此时整体与部分之间是可分离的, 他们可以具有各自的生命周期, 部分可以属于多个整体对象, 也可以为多个整体对象享. 比如计算机与 CPU, 公司与员工的关系等.
    表现在代码层面, 和关联关系是一致的,只能从语义级别来区分.

    2. 组合

    组合也是关联关系的一种特例, 它体现的是一种 contains-a 的关系, 这种关系比聚合更强, 也称为强聚合. 它同样体现整体与部分间的关系, 但此时整体与部分是不可分的, 整体的生命周期结束也就意味着部分的生命周期结束. 比如你和你的大脑. 表现在代码层面, 和关联关系是一致的,只能从语义级别来区分.

    辅助理解:

    大雁喜欢热闹害怕孤独, 所以它们一直过着群居的生活, 这样就有了雁群. 每一只大雁都有自己的雁群, 每个雁群都有很多大雁, 大雁与雁群的这种关系就可以称之为聚合. 另外, 每只大雁都有两只翅膀, 大雁与雁翅的关系就叫做组合. 由此可见, 聚合的关系明显没有组合紧密, 大雁不会因为它们的首领将雁群解散而无法生存, 而雁翅就无法脱离大雁而单独生存.所以说, 聚合关系的类具有不同的生命周期, 而组合关系的类具有相同的生命周期.

    ----------------------------------------------------------------

    参考资料:

    1. python的几种实现方式

    2. python中的接口

    3. 面向对象中的聚合与耦合

    ----------------------------------------------------------------

  • 相关阅读:
    树与堆
    Python基础
    python基础
    Flask基础知识
    其他(MySQL)
    发生错误:请确认您的电脑是否安装了excel软件,并且您的浏览器是否允许远行excel!具体操作请查阅帮助.
    idea启动项目,报java.lang.OutOfMemoryError: PermGen space 和启动项目很慢的问题解决
    安装jdk,tomcat,oracle,PL/SQL的一些问题
    linux下安装jdk8,nginx
    mybatic中xml新增一条数据获取自增id
  • 原文地址:https://www.cnblogs.com/haitaoli/p/9746287.html
Copyright © 2011-2022 走看看