Python 面向对象课程笔记


前言

Python 面向对象


正文

基本概念

  • 什么是对象:

    • 万物皆对象
    • 对象是具体物体:
      • 拥有属性
      • 拥有行为
      • 封装零散为整体
    • OOP(Object Oriented Programming)面向对象编程:
      • python 中一切都是对象
  • 面向对象 or 面向过程:都是解决问题的思路
    • 面向过程:关注解决问题每一个过程
    • 面向对象:关注解决问题所需要的对象
  • 对象 抽象出 类; 类 实例化 对象。
  • 经典类 和 新式类:是(新)否(旧)继承了 object
  • 面向对象的三大特性:
    • 封装
    • 继承
    • 多态

属性

  • 属性和变量的区别

    • 变量是可以改变的量值(存在不同访问权限)
    • 属性表示对象的特性(只能通过对象访问,对象通过变量引用,因此和变量一样存在不同的访问权限)
  • 类属性和对象属性
    • 对象属性:仅属于对象

      • 查看对象所有属性obj.__dict__,返回字典。
      • 添加对象属性obj.age = 18
      • 通过对象可以访问到类属性:查询逻辑是优先查找对象自身,如果没找到则根据class找到对象对应的类,从类中寻找。
      • 通过对象只能访问类属性,而不能修改。
      • 只能删除对象本身属性(直系属性)
    • 类属性:属于该类的所有对象
      • 类也是对象
      • 增改查删
        • 查询:和对象查询一样.__dict__
        • 删除: del class_name.xxx
        • 类的属性无法修改(只读),对象的属性可以直接修改
      • 类属性被各对象所共享
  • __slots__ = ['xxx']:表示该类创建的对象只能添加指定('xxx')属性

方法

  • 方法划分:

    • 实例方法:类实例化出来的实例对象,默认第一个参数必须收到一个实例
    • 类方法:默认第一个参数必须收到一个类
    • 静态方法:第一个参数不默认接收
    • 注意
      • 划分依据是第方法第一个参数必须要接受的数据类型
  • 一个目标的行为动作
  • @classmethod 装饰器,类方法
  • @staticmethod 静态方法
  • 方法的使用:根据规则和调用,来针对不同的问题设计不同的方法
  • 装饰器的作用:在保证原本函数不改变的前提下,直接给函数增加功能
  • 元类:类是由另外一个类所创建出来的,因此存在创建类对象的类。(type)
  • 因此可以用 type 来手动创建类型
  • 元类根据__metaclass__来指明
  • 可以通过.__base__查看父类
class Person:
__metaclass__ = xxx
  • 类的创建流程:

    • 检测类对象是否有明确的mateclass属性。
    • 检测父类中是否存在mateclass属性。
    • 检测模块中是否存在mateclass属性。
    • 通过内置的 type 这个元类来创建这个类对象。
  • 类的描述:方便合作开发(标准注释)
    • 参数的含义和格式,方法作用,是否有默认值
  • 生成项目文档
    • 方法 1:内置模块 pydoc

      • python -m pydoc -w 模块名称
    • 方法 2:第三方模块(Sphinx;epydoc;doxygen)
  • 私有化属性(伪私有,python 没有私有化):
    • x:共有
    • _x:受保护,类内部,子类内部,模块其他位置或者跨模块访问会被 warm,跨模块时如果from xxx import *会失败,本模块__all__ = ["xxx"]表示其他模块中可以导入。
    • **x:受保护,只有类内部能用。但对于在类外的**\_效果一样
    • 因为伪私有,还是可以强行访问,比如xxx.__dict__
  • 私有化方法:和私有化属性类似
  • __init__创建实例对象后自动调用该方法
  • 只读属性:
    • 方式 1:

      • 全部隐藏:私有化操作__
      • 部分公开:公开
    • 方式 2:可以以@property使用属性的方式来使用该方法
      • 获得使用@property,修改使用@xxx.setter,删除使用@xxx.deleter
  • 经典类 和 新式类的区别:
    • 经典类中 property 只有读取方法有效
  • setattr,通过实例.属性 = v 时,会调用该方法、通过该方法 来判断是否将属性添加到dict字典
  • 内置特殊属性:
    • 类属性:

      • __dict__:类属性
      • __bases__:类所有父类的元组
      • __doc__:类的文档字符串
      • __name__:类名
      • __module__:类定义所在的模块
    • 实例属性:
      • __dict__:实例的属性
      • __class__:实例对应的类
  • 参数:*args,**kwargs
  • 内置特殊方法:
    • 生命周期方法:
    • others:
      • 信息格式化:

        • __str__:print 当前类时,会直接调用`str也可以通过 str(实例)获得.(面向用户)
        • __repr__:str 的次选项,也可以通过 repr()直接调用或者直接输出实例(交互环境)(面向开发)
      • 调用操作:__call__:让实例具备被调用的能力
      • 索引操作:通过实现三个内置方法
        • __setitem__
        • __getitem__
        • __delitem__
      • 切片操作:python3 中统一由索引操作实现了
      • 比较大小:
        • 相等:__eq__ == or != ,也可以再写__ne__针对不等单独定义
        • 大于 gt
        • 大于等于 ge
        • 小于 lt
        • 小于等于 le
        • 对于相反操作,如果只定义了其中一个,解释器会自动反向操作
        • @functools.total_ordering 会自动补全组合操作
        • 布尔值:__bool__
      • 遍历操作:
        • 实现 for in 遍历:

          • __getitem__,记得设置停止条件 raise StopIteration("xxx")
          • __iter__,优先级更高
          • __next__,变成迭代器,注意设置终止条件
          • 迭代器必须有 iter 和 next 方法,可迭代对象只需要实现 iter.可迭代对象一定可以通过 for in 访问,但可以通过 for in 迭代不一定是可迭代对象.
          • 多次重复使用需要回退
      • 描述器:可以描述属性操作的对象
        • __set__(self,instance,owner)
        • __get__(self,instance,value)
        • __delete__(self,instance)
        • 定义方式:
          • property
          • 先定义一个类,设定 get,set,delete.然后直接调用这个类(即描述器).调用是通过实例不是类调用.
        • 只实现了 get,就是非资料描述器,实现 get 和 set 是资料描述器.
        • 优先级:资料描述器 > 实例属性 > 非资料描述器
      • 使用类,实现装饰器:
        • __init__接收并保存 func,__call__使用 func

内存管理机制

  • python 的生命周期:

    • 监听对象生命周期:会自动调用

      • __new__ 初始化建立
      • __del__ 释放
      • __init__
    • id 函数获得对象内存地址,hex 函数获得对应的 16 进制地址
    • 内存管理机制:引用计数器+垃圾回收机制
      • 存储
      • 引用计数器:对当前引用个数进行计数,系统会去检查那些引用计数为 0 的对象,然后清除其在内存的空间。
      • 垃圾回收:找到循环引用,当内存中有不再使用的部分时,垃圾收集器就会把他们清理掉。
        • 分代回收
      • 查看引用计数,需要包 import sys ,sys.getrefcount(对象),注意:这里也引用了对象,所以计数器会增加 1。
  • 链式编程

三大特性

  • 封装:

    • 好处: 1. 使用方便 2. 使用安全 3. 便于维护
  • 继承
    • 继承的使用权,并非复制
    • 优点:方便资源重用
    • 单继承 和 多继承
    • type 和 object 的区别?

      python 面向对象中有两种体系,分别是父子关系和实例关系.

      • type 创造(实例化)了 object(实例)
      • type 也继承自 object(父子)
    • 继承下的影响:
      • 资源的继承:只继承公有属性和方法&内置方法&受保护的属性和方法
      • 资源的使用:
        • 不同继承形态的原则:

          • 单继承链
          • 无重叠的多继承链:优先左侧,深度优先
          • 有重叠的多继承链:优先左侧,广度优先
          • 新式类:C3 算法
          • cls.mro()可以查看查找顺序
      • 资源的覆盖
        • self 和 cls,谁调用的资源,self 和 cls 就指向谁
      • 资源的累加:
        • 子类比父类多一些自己特有的资源
        • 在被覆盖的资源上进行添加修改
        • 经典类会产生重复调用的问题
        • 新式类使用 super
          • super(param1,param2):,沿着 mro 链条来调用 | 沿着 param2 的链条,找到 param1 的下一个节点.python3 版本都自动找了.
  • 多态
    • 概念:一个类所延伸的多种形态 and 调用时的多种形态.
    • python 里没有真正意义上的多态.
  • 补充
    • 抽象类

      • 不是具化的类,无法创建
    • 抽象方法
      • 不能具体实现和直接调用
    • 无法直接实现, 需要使用 abc 库
      • import abc; metaclass = abc.ABCMeta; @abc.abstractmethod
      • 抽象方法如果被继承,那么子类中一定要实现
  • OOP 设计原则:
    • SOLID:

      • S(Single Responsibility Principle):单一职责原则 - 一个类只负责一项职责
      • O(Open Closed Principle):开放封闭原则 - 对扩展开放,对修改关闭
      • L(Liskov Substitution Principle):里氏替换原则 - 使用基类引用的地方必须能使用继承类的方法
      • I(Interface Segregation Principle):接口分离 - 如果类包含过多接口方法,尽可能的分割方法
      • D(Dependency Inversion Principle):依赖倒置 - 高层模块不应该依赖底层模块

Python 面向对象笔记的更多相关文章

  1. python 面向对象-笔记

    1.如何创建类 class 类名: pass class bar: pass 2.创建方法 构造方法,__init__(self,arg) obj = 类('a1') 普通方法 obj = 类(‘xx ...

  2. python面向对象笔记

    一.封装(属性/私有方法/公有方法/静态方法/构造函数...) # 定义一个类 class Animal: # 私有成员(用_开头的约定为私有成员 - 注:仅仅是君子协定) _age = 0 # 构造 ...

  3. python学习笔记六 初识面向对象上(基础篇)

    python面向对象   面向对象编程(Object-Oriented Programming )介绍   对于编程语言的初学者来讲,OOP不是一个很容易理解的编程方式,虽然大家都知道OOP的三大特性 ...

  4. python学习笔记15(面向对象编程)

    虽然Python是解释性语言,但是它是面向对象的,能够进行对象编程. 一.如何定义一个类 在进行python面向对象编程之前,先来了解几个术语:类,类对象,实例对象,属性,函数和方法. 类是对现实世界 ...

  5. [Python学习笔记][第六章Python面向对象程序设计]

    1月29日学习内容 Python面向对象程序设计 类的定义与使用 类定义语法 使用class关键词 class Car: def infor(self): print("This is ca ...

  6. Python学习笔记【第十一篇】:Python面向对象高级

    isinstance(obj,cls)和issubclass(sub,super) class Person(object): def __init__(self, name, age, sex, n ...

  7. [Python]面向对象近期笔记-super

    Python面向对象高级 直接调用父类方法 class A: def __init__(self): print("hello") class B(A): def __init__ ...

  8. OpenCV之Python学习笔记

    OpenCV之Python学习笔记 直都在用Python+OpenCV做一些算法的原型.本来想留下发布一些文章的,可是整理一下就有点无奈了,都是写零散不成系统的小片段.现在看 到一本国外的新书< ...

  9. Python学习笔记基础篇——总览

    Python初识与简介[开篇] Python学习笔记——基础篇[第一周]——变量与赋值.用户交互.条件判断.循环控制.数据类型.文本操作 Python学习笔记——基础篇[第二周]——解释器.字符串.列 ...

随机推荐

  1. 【Azure 应用服务】App Service For Windows 环境中部署Python站点后,如何继续访问静态资源文件呢(Serving Static Files)?

    问题描述 当创建一个App Service 后,运行时环境和版本选择Windows 和 Python 3.6. 登录Kudu 站点查看,默认的文件有 web.config, hostingstart- ...

  2. 分布式系列-分布式ID

    一.数据库自增(单实例) 1.方案描述 基于数据库自增ID(auto_increment)利用其来充当分布式ID.实现方式就是用一张表来充当ID生成器,当我们需要ID时,向表中插入一条记录返回主键ID ...

  3. 计算机基础知识以及java JDK、JRE

    计算机 计算机(Computer)全称:电子计算机,是一种能够按照程序运行,自动.高速处理海量数据的现代化智能电子设备.由硬件和软件所组成,没有安装任何软件的计算机称为裸机.常见的形式有台式计算机.笔 ...

  4. Flex语法和常用鼠标手势

    Flex弹性和模型 1.display : flex/inline-flex ;(设置给氟元素) flex : 将对象作为弹性伸缩盒显示: inline-flex : 将对象作为内联块级弹性伸缩显示: ...

  5. freeswitch 编译安装后的配置

    --------------------FreeSWITCH configuration------------Locations: prefix: /usr/local/freeswitchexec ...

  6. EditPlus配置C/C++运行环境

    1.安装MinGW和EditPlus 2.打开EditPlus ctrl+1 编译 ctrl+2 运行

  7. webpack learn1-webpack-dev-server的配置和使用3

    首先输入命令来安装webpack-dev-server npm i webpack-dev-server 在package.json文件中添加代码: "scripts": { &q ...

  8. Spring Cloud Gateway 没有链路信息,我 TM 人傻了(上)

    本系列是 我TM人傻了 系列第五期[捂脸],往期精彩回顾: 升级到Spring 5.3.x之后,GC次数急剧增加,我TM人傻了 这个大表走索引字段查询的 SQL 怎么就成全扫描了,我TM人傻了 获取异 ...

  9. ubuntu系统执行生成密匙命令后,home目录下面没有生成.ssh目录

    ubuntu系统配置git ssh时,执行:ssh-keygen -trsa -C "youremail@example.com",home目录下面没有生成.ssh目录. .ssh ...

  10. javascript 高阶函数 实现 AOP 面向切面编程 Aspect Oriented Programming

    AOP的主要作用是吧一些跟核心业务逻辑模块无关的功能 -日志统计, 安全控制, 异常处理- 抽离出来, 再通过"动态织入"的方式掺入业务逻辑模块中. 这里通过扩展Function. ...