python面向对象的知识梳理
面向对象(Object Oriented Programming)
三个基本特征:
1.封装:包含两个概念,对象将变量(状态)和方法(用来改变状态或执行涉及状态的计算)集中在一个地方—即对象本身。
通过封装隐藏类的内部数据,以避免客户端(client)代码(即类外部的代码)直接进行访问。
2.继承:在创建类时,该类也可以从另一个类那里继承方法和变量。被继承的类,称为父类(parent class);继承的类则被称为子类(child class)
3.多态:为不同的基础形态(数据类型)提供相关接口的能力。(其中接口指的就是函数或者方法)
变量:
类变量:属于类对象及其创建的对象。
实例变量:实例变量属于对象。
在 定义属性或方法时,在 属性名或者方法名前 增加 两个下划线,定义的就是 私有 属性或方法
其中在类中的方法可以调用私有方法和变量
但是子类不能访问父类的私有方法及私有变量
class Dog(object):
def __init__(self, name, age):
self.name = name
self.__age = age def eat(self):
print('eating',self.__age)
self.__eating_food() def __eating_food(self):
print("food", self.name) if __name__ == '__main__':
d = Dog("tom", 15)# eating 15
d.eat()# food tom
但是Python 中,并没有 真正意义 的 私有
给 属性、方法 命名时,实际是对 名称 做了一些特殊处理,使得外界无法访问到处理方式:在 名称 前面加上 _类名 => _类名__名称(例如d_Dog_age)
单例模式
设计模式
- 设计模式 是 前人工作的总结和提炼,通常,被人们广泛流传的设计模式都是针对 某一特定问题 的成熟的解决方案
- 使用 设计模式 是为了可重用代码、让代码更容易被他人理解、保证代码可靠性
单例设计模式
- 目的 —— 让 类 创建的对象,在系统中 只有 唯一的一个实例
- 每一次执行
类名()返回的对象,内存地址是相同的
__new__ 方法
- 使用 类名() 创建对象时,
Python的解释器 首先 会 调用__new__方法为对象 分配空间 __new__是一个 由object基类提供的 内置的静态方法,主要作用有两个:- 1) 在内存中为对象 分配空间
- 2) 返回 对象的引用
Python的解释器获得对象的 引用 后,将引用作为 第一个参数,传递给__init__方法
重写
__new__方法 的代码非常固定!
- 重写
__new__方法 一定要return super().__new__(cls) - 否则 Python 的解释器 得不到 分配了空间的 对象引用,就不会调用对象的初始化方法
- 注意:
__new__是一个静态方法,在调用时需要 主动传递cls参数
Python 中的单例
- 单例 —— 让 类 创建的对象,在系统中 只有 唯一的一个实例
- 定义一个 类属性,初始值是
None,用于记录 单例对象的引用 - 重写
__new__方法 - 如果 类属性
is None,调用父类方法分配空间,并在类属性中记录结果 - 返回 类属性 中记录的 对象引用
- 定义一个 类属性,初始值是
只执行一次初始化工作
- 在每次使用
类名()创建对象时,Python的解释器都会自动调用两个方法:__new__分配空间__init__对象初始化
- 在上一小节对
__new__方法改造之后,每次都会得到 第一次被创建对象的引用 - 但是:初始化方法还会被再次调用
需求
- 让 初始化动作 只被 执行一次
解决办法
- 定义一个类属性
init_flag标记是否 执行过初始化动作,初始值为False - 在
__init__方法中,判断init_flag,如果为False就执行初始化动作 - 然后将
init_flag设置为True - 这样,再次 自动 调用
__init__方法时,初始化动作就不会被再次执行 了class MusicPlayer(object): # 记录第一个被创建对象的引用
instance = None
# 记录是否执行过初始化动作
init_flag = False def __new__(cls, *args, **kwargs): # 1. 判断类属性是否是空对象
if cls.instance is None:
# 2. 调用父类的方法,为第一个对象分配空间,第一次调用父类方法返回的结果用cls.instance这个变量保存
cls.instance = super().__new__(cls) # 3. 返回类属性保存的对象引用(可以理解为第一次为对象分配的内存地址)
return cls.instance def __init__(self): if not MusicPlayer.init_flag:
print("初始化音乐播放器") MusicPlayer.init_flag = True # 创建多个对象
player1 = MusicPlayer()
print(player1) player2 = MusicPlayer()
print(player2)
python面向对象的知识梳理的更多相关文章
- Python 面向对象基础知识
面向对象基础知识 1.什么是面向对象编程? - 以前使用函数 - 类 + 对象 2.什么是类什么是对象,又有什么关系? class 类: def 函数1(): pass def 函数2(): pass ...
- Python面向对象基础知识
面向对象是一种编程方式,此编程方式的实现是基于对类和对象的使用 类是一个模板,模板中包装了多个“函数”供使用(可以讲多函数中公用的变量封装到对象中) 对象,根据模板创建的实例(即:对象),实例用于调用 ...
- Python面向对象相关知识1
1. python是动态的语言,这样在使用类的时候,类的属性就可以随意的添加,但是这样在实际开发中有一定的缺陷,所以,可以在类中定义一个特殊的__init__()方法,当创建实例时,__init__( ...
- #5 Python面向对象(四)
前言 本节将是Python面向对象的最后一篇博文了,这节将记录类的特殊方法.特殊成员方法.旧类和新类的不同,以及一些其他知识.Go! 一.类的特殊方法 Python有三种特殊方法:实例方法.静态方法. ...
- python反射和面向对象的知识并简述基本的异常
# 1.面向对象不是所有的情况都适用# 2.面向对象编程# a.定义类# class Foo:# def 方法1(self,bb):# b.根据类创建对象(创建) # class Person():# ...
- python面向对象重新梳理
关于本篇博文: 面向对象中所有的内容的重新梳理,其实面向对象的知识早在一个多月前就学习过并整理过,但是发现还是有所欠缺,故在此以极其简介的语言风格重新梳理一遍 面向对象详细介绍:http://www. ...
- python 面向对象初级篇
Python 面向对象(初级篇) 概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发" ...
- python面向对象进阶(八)
上一篇<Python 面向对象初级(七)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使 ...
- python面向对象初级(七)
概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发“更快更好更强...” 面向过程编程最易被初学 ...
随机推荐
- 关于codeforces国内访问卡顿慢的最新解决办法,谷歌字体库/屏蔽facebook链接
在host里最后加上 方法起源来自于https://blog.csdn.net/qq_40693171/article/details/83623409 但是里面的360字体库已经停运http://w ...
- C# 7.0特性
一.out的形参变量无需再提前声明 befor: "; int numericResult; if (int.TryParse(input, out numericResult)) Cons ...
- 【转载】npm查看全局安装过的包
在使用node的时候,用npm安装了很多软件,过一段时间没有使用就会忘记,怎么查看自己全局安装过的包,用命令 npm list -g --depth 在百度里搜不到结果的,我在google里老外的文章 ...
- 20175226 2018-2019-2《java程序设计》结对编程-四则运算(第一周-阶段总结)
结对编程-四则运算(第一周-阶段总结) 需求分析 实现一个四则运算程序,要求: 自动随机生成小学四则运算题目(加,减,乘,除) 支持整数.真分数且支持多项式 能够利用栈的思想,将中缀转换为后缀表达式 ...
- shutil&shelve
https://www.cnblogs.com/xiangsikai/p/7787101.html http://www.cnblogs.com/wupeiqi/articles/4963027.ht ...
- 处理 oracle 数据库导入报错“IMP-00058: 遇到 ORACLE 错误 942”
在导入数据文件的时候出现了下图错误: 经过多次百度搜索问题.得知问题错误方向: 仔细的查询了被导入数据的数据库的版本: 而 被导入的数据包 dmp 文件是从 oracle11g r2的版本导出的. 所 ...
- flutter 解析json
关于flutter 解析json 自己看了几天,最近才大概知道是怎么个情况. 首先 要处理的 是后端返回的数据 ,如果是直接请求的话返回的是json 字符串 然后要把字符串转成对象,有几种方式参考 第 ...
- [原创]Vivado SDK Initializing s/w repositories不动
21:56:16 INFO : Launching XSDB server: xsdb.bat C:/Xilinx/SDK/2015.4/scripts/xsdb/xsdb/xsdb-server.t ...
- SpringBoot的Profiles根据开发环境和测试环境载入不同的配置文件
参考:https://www.cnblogs.com/bjlhx/p/8325374.html 1.需要有一个默认的配置文件,然后一个正式的配置文件,一个测试的配置文件.激活配置项,默认的配置文件ap ...
- React:受控组件与非受控组件混用实战 - 译文
原文链接:React: hybrid controlled components in action 受控组件 非受控组件 混用受控组件和非受控组件 原则一 原则二 原则三 原则四 实施方案 总结 F ...