• Python基础复习(第三天)


    面向对象

      面向对象的核心是"数据"与"功能"的整合
    

    类的定义与实例化

      1.使用关键字class定义类
      2.类的命名应该使用“驼峰体”
      3.类名.__dict__:该方法可以查看类这个容器内盛放的东西            
      4.类名():实例化
    

    属性查找顺序

      1.对象的名称空间里只存放着对象独有的属性,而对象们相似的属性是存放于类中的。对象在访问属性时,会优先从对象本身的__dict__中查找,未找到,则去类的__dict__中查找
      Ⅰ.类中定义的变量是类的数据属性,是共享给所有对象用的,指向相同的内存地址
      Ⅱ.类中定义的函数是类的函数属性,类可以使用,但必须遵循函数的参数规则,有几个参数需要传几个参数,但其实类中定义的函数主要是给对象使用的,而且是绑定给对象的,虽然所有对象指向的都是相同的功能,但是绑定到不同的对象就是不同的绑定方法,内存地址各不相同,绑定到对象的方法特殊之处在于,绑定给谁就应该由谁来调用,谁来调用,就会将’谁’本身当做第一个参数自动传入(方法__init__也是一样的道理)
    

    封装

      1.封装指的就是把数据与功能都整合到一起,听起来是不是很熟悉,没错,我们之前所说的”整合“二字其实就是封装的通俗说法。除此之外,针对封装到对象或者类中的属性,我们还可以严格控制对它们的访问,分两步实现:隐藏与开放接口
      2.Python的Class机制采用双下划线开头的方式将属性隐藏起来(设置成私有的),但其实这仅仅只是一种变形操作,类中所有双下滑线开头的属性都会在类定义阶段、检测语法时自动变成“_类名__属性名”的形式
      3.总结隐藏属性与开放接口,本质就是为了明确地区分内外,类内部可以修改封装内的东西而不影响外部调用者的代码;而类外部只需拿到一个接口,只要接口名、参数不变,则无论设计者如何改变内部实现代码,使用者均无需改变代码。这就提供一个良好的合作基础,只要接口这个基础约定不变,则代码的修改不足为虑
      4.装饰器property,可以将类中的函数“伪装成”对象的数据属性            
    

    继承

      1.继承是一种创建新类的方式,在Python中,新建的类可以继承一个或多个父类,新建的类可称为子类或派生类,父类又可称为基类或超类
      2.通过类的内置属性__bases__可以查看类继承的所有父类
      3.提示:object类提供了一些常用内置方法的实现,如用来在打印对象时返回字符串的内置方法__str__
      4.有了继承关系,对象在查找属性时,先从对象自己的__dict__中找,如果没有则去子类中找,然后再去父类中找
      5.父类如果不想让子类覆盖自己的方法,可以采用双下划线开头的方式将方法设置为私有的
      6.python到底是如何实现继承的呢? 对于你定义的每一个类,Python都会计算出一个方法解析顺序(MRO)列表,该MRO列表就是一个简单的所有基类的线性顺序列表
      7.python会在MRO列表上从左到右开始查找基类,直到找到第一个匹配这个属性的类为止。 而这个MRO列表的构造是通过一个C3线性化算法来实现的。我们不去深究这个算法的数学原理,它实际上就是合并所有父类的MRO列表并遵循如下三条准则
      Ⅰ. 子类会先于父类被检查
      Ⅱ. 多个父类会根据它们在列表中的顺序被检查
      Ⅲ. 如果对下一个类存在两个合法的选择,选择第一个父类         
      8.Python语言可没有接口功能,但Python提供了Mixins机制,简单来说Mixins机制指的是子类混合(mixin)不同类的功能,而这些类采用统一的命名规范(例如Mixin后缀),以此标识这些类只是用来混合功能的,并不是用来标识子类的从属"is-a"关系的,所以Mixins机制本质仍是多继承,但同样遵守”is-a”关系
      9.使用Mixin类实现多重继承要非常小心
      Ⅰ. 首先它必须表示某一种功能,而不是某个物品,python 对于mixin类的命名方式一般以 Mixin, able, ible 为后缀
      Ⅱ. 其次它必须责任单一,如果有多个功能,那就写多个Mixin类,一个类可以继承多个Mixin,为了保证遵循继承的“is-a”原则,只能继承一个标识其归属含义的父类
      Ⅲ. 然后,它不依赖于子类的实现
      Ⅳ. 最后,子类即便没有继承这个Mixin类,也照样可以工作,就是缺少了某个功能。(比如飞机照样可以载客,就是不能飞了)
    

    派生

      1.子类可以派生出自己新的属性,在进行属性查找时,子类中的属性名会优先于父类被查找
      2.派生方法:
      Ⅰ. “指名道姓”地调用某一个类的函数:类名.方法()
      Ⅱ. 调用super()会得到一个特殊的对象,该对象专门用来引用父类的属性,且严格按照MRO规定的顺序向后查找
    

    组合

      组合则是一种“有”的关系,比如老师有生日,老师有多门课程,当类之间有显著不同,并且较小的类是较大的类所需要的组件时,应该使用组合
    

    多态

      1.多态指的是一类事物有多种形态,比如动物有多种形态:猫、狗、猪
      2.但其实我们完全可以不依赖于继承,只需要制造出外观和行为相同对象,同样可以实现不考虑对象类型而使用对象,这正是Python崇尚的“鸭子类型”(duck typing):“如果看起来像、叫声像而且走起路来像鸭子,那么它就是鸭子”。比起继承的方式,鸭子类型在某种程度上实现了程序的松耦合度      
    

    绑定方法

      在类中正常定义的函数默认是绑定到对象的,而为某个函数加上装饰器@classmethod后,该函数就绑定到了类
      绑定到类的方法就是专门给类用的,但其实对象也可以调用,只不过自动传入的第一个参数仍然是类,也就是说这种调用是没有意义的,并且容易引起混淆,这也是Python的对象系统与其他面向对象语言对象系统的区别之一
    

    非绑定方法

      为类中某个函数加上装饰器@staticmethod后,该函数就变成了非绑定方法,也称为静态方法。该方法不与类或对象绑定,类与对象都可以来调用它,但它就是一个普通函数而已,因而没有自动传值那么一说
    

    反射

      反射机制指的是在程序的运行状态中,对于任意一个类,都可以知道这个类的所有属性和方法,对于任意一个对象,都能够调用他的任意方法和属性                        
      1.在python中实现反射非常简单,在程序运行过程中,如果我们获取一个不知道存有何种属性的对象,若想操作其内部属性,可以先通过内置函数dir来获取任意一个类或者对象的属性列表,列表中全为字符串格式 
      2.接下来就是想办法通过字符串来操作对象的属性了,这就涉及到内置函数hasattr、getattr、setattr、delattr的使用了(Python中一切皆对象,类和对象都可以被这四个函数操作,用法一样) 
    

    内置方法

      1. __str__方法会在对象被打印时自动触发,print功能打印的就是它的返回值,我们通常基于方法来定制对象的打印信息,该方法必须返回字符串类型
      2.__del__会在对象被删除时自动触发。由于Python自带的垃圾回收机制会自动清理Python程序的资源,所以当一个对象只占用应用程序级资源时,完全没必要为对象定制__del__方法,但在产生一个对象的同时涉及到申请系统资源(比如系统打开的文件、网络连接等)的情况下,关于系统资源的回收,Python的垃圾回收机制便派不上用场了,需要我们为对象定制该方法,用来在对象被删除时自动触发回收系统资源的操作
      3.__doc__:文档注释
      4.__new__:产生空对象
      4.__call__:产生空对象,调用init方法,返回初始化好的对象
    

    元类

      1.class关键字创建类的流程分析
      Ⅰ. 拿到类名
      Ⅱ. 拿到类的基类
      Ⅲ. 执行类体代码,拿到类的名称空间
      Ⅳ. 调用元类得到类             
      2.一个类没有声明自己的元类,默认他的元类就是type,除了使用内置元类type,我们也可以通过继承type来自定义元类,然后使用metaclass关键字参数为一个类指定元类
      3.调用一个对象,就是触发对象所在类中的__call__方法的执行
      4.单例模式
      Ⅰ. 定义一个类方法实现单例模式
      Ⅱ. 定制元类实现单例模式
      Ⅲ. 定义一个装饰器实现单例模式
    

    异常处理

      1.语法
      try:
            被检测的代码块
      except 异常类型:
            检测到异常,就执行这个位置的逻辑
      else:
            没有异常发生时执行的代码块
      finally:
            无论有无异常都会执行的代码
  • 相关阅读:
    基于jquery和bootstrap的下拉框左右选择功能
    移动端监听输入手机号以及判断手机号有效
    Latex中文识别texlive中文
    C++、堆栈
    项目大作业图书管理系统
    DIV页面分部
    Eclipse建立Java Web项目
    Java Web开发时JSP乱码问题
    python sdnu校园网模拟登陆
    pip 安装命令
  • 原文地址:https://www.cnblogs.com/qijiaxun/p/14206824.html
Copyright © 2020-2023  润新知