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)
- 方法 1:内置模块 pydoc
- 私有化属性(伪私有,python 没有私有化):
- x:共有
- _x:受保护,类内部,子类内部,模块其他位置或者跨模块访问会被 warm,跨模块时如果
from xxx import *
会失败,本模块__all__ = ["xxx"]
表示其他模块中可以导入。 - **x:受保护,只有类内部能用。但对于在类外的
**
和\_
效果一样 - 因为伪私有,还是可以强行访问,比如
xxx.__dict__
- 私有化方法:和私有化属性类似
__init__
创建实例对象后自动调用该方法- 只读属性:
- 方式 1:
- 全部隐藏:私有化操作
__
- 部分公开:公开
- 全部隐藏:私有化操作
- 方式 2:可以以
@property
使用属性的方式来使用该方法- 获得使用@property,修改使用@xxx.setter,删除使用@xxx.deleter
- 方式 1:
- 经典类 和 新式类的区别:
- 经典类中 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 迭代不一定是可迭代对象.
- 多次重复使用需要回退
- 实现 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):依赖倒置 - 高层模块不应该依赖底层模块
- SOLID:
Python 面向对象笔记的更多相关文章
- python 面向对象-笔记
1.如何创建类 class 类名: pass class bar: pass 2.创建方法 构造方法,__init__(self,arg) obj = 类('a1') 普通方法 obj = 类(‘xx ...
- python面向对象笔记
一.封装(属性/私有方法/公有方法/静态方法/构造函数...) # 定义一个类 class Animal: # 私有成员(用_开头的约定为私有成员 - 注:仅仅是君子协定) _age = 0 # 构造 ...
- python学习笔记六 初识面向对象上(基础篇)
python面向对象 面向对象编程(Object-Oriented Programming )介绍 对于编程语言的初学者来讲,OOP不是一个很容易理解的编程方式,虽然大家都知道OOP的三大特性 ...
- python学习笔记15(面向对象编程)
虽然Python是解释性语言,但是它是面向对象的,能够进行对象编程. 一.如何定义一个类 在进行python面向对象编程之前,先来了解几个术语:类,类对象,实例对象,属性,函数和方法. 类是对现实世界 ...
- [Python学习笔记][第六章Python面向对象程序设计]
1月29日学习内容 Python面向对象程序设计 类的定义与使用 类定义语法 使用class关键词 class Car: def infor(self): print("This is ca ...
- Python学习笔记【第十一篇】:Python面向对象高级
isinstance(obj,cls)和issubclass(sub,super) class Person(object): def __init__(self, name, age, sex, n ...
- [Python]面向对象近期笔记-super
Python面向对象高级 直接调用父类方法 class A: def __init__(self): print("hello") class B(A): def __init__ ...
- OpenCV之Python学习笔记
OpenCV之Python学习笔记 直都在用Python+OpenCV做一些算法的原型.本来想留下发布一些文章的,可是整理一下就有点无奈了,都是写零散不成系统的小片段.现在看 到一本国外的新书< ...
- Python学习笔记基础篇——总览
Python初识与简介[开篇] Python学习笔记——基础篇[第一周]——变量与赋值.用户交互.条件判断.循环控制.数据类型.文本操作 Python学习笔记——基础篇[第二周]——解释器.字符串.列 ...
随机推荐
- 详解 Apache SkyWalking 跨进程传播协议
简介 SkyWalking 跨进程传播协议是用于上下文的传播,本文介绍的版本是3.0,也被称为为sw8协议. Header项 Header应该是上下文传播的最低要求. Header名称:sw8. He ...
- Spring源码浅析之bean实例的创建过程(二)
在上一篇内容中,介绍了doGetBean方法的源码内容,知道了bean在创建的过程中,有三个范围,单例.多例.Scope,里面都使用到了createBean.下面本篇文章的主要内容,就是围绕creat ...
- SpringMVC笔记(3)
一.SpringMVC 拦截器 1.1 快速入门 步骤 创建拦截器类实现HandlerInterceptor接口 public class MyInterceptor01 implements Han ...
- 小程序使用 lodash 的问题
import _ from 'lodash' 报错: vendor.js:11874 Uncaught TypeError: Cannot read property 'prototype' of u ...
- AWS扩容EC2实例根空间
文章原文 aws 端操作 先在EC2 实例中选中磁盘 然后打开跟设备 修改大小后保存 ec2 端操作 lsblk 查看当前设备的磁盘编号 df -T -H 查看扩容前的空间大小并确定磁盘格式 grow ...
- 聊一聊开闭原则(OCP).
目录 简述 最早提出(梅耶开闭原则) 重新定义(多态开闭原则) 深入探讨 OCP的两个特点 对外扩展开放(Open for extension) 对内修改关闭 抽象 关闭修改.对外扩展? 简述 在面向 ...
- Git - 命令行 常用
一.合并其他分支的commit(A分支中的commit合并至B分支) 切换到A分支,查询commit历史命令行 : $ git log 复制要合并的commit id (如:663802dfb121e ...
- 深入学习PHP中的JSON相关函数
在我们当年刚刚上班的那个年代,还全是 XML 的天下,但现在 JSON 数据格式已经是各种应用传输的事实标准了.最近几年开始学习编程开发的同学可能都完全没有接触过使用 XML 来进行数据传输.当然,时 ...
- linux新安装了php,但是使用mysqli连接数据库一直超时
centos7+mysql5.5+php5.6+nginx mysql php nginx都安装完成,然后启动了,网站也运行, 但是php文件中使用mysqli_connect时一直超时,有时也报错, ...
- python mysql增加改查
#python mysql增加改查,方便日后copy/paste .......... 1 #encoding: UTF-8 2 import pymysql 3 # # 打开数据库连接 4 db = ...