面向对象(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 中的单例

  • 单例 —— 让 创建的对象,在系统中 只有 唯一的一个实例
    1. 定义一个 类属性,初始值是 None,用于记录 单例对象的引用
    2. 重写 __new__ 方法
    3. 如果 类属性 is None,调用父类方法分配空间,并在类属性中记录结果
    4. 返回 类属性 中记录的 对象引用

  

只执行一次初始化工作

  • 在每次使用 类名() 创建对象时,Python 的解释器都会自动调用两个方法:

    • __new__ 分配空间
    • __init__ 对象初始化
  • 在上一小节对 __new__ 方法改造之后,每次都会得到 第一次被创建对象的引用
  • 但是:初始化方法还会被再次调用

需求

  • 初始化动作 只被 执行一次

解决办法

  1. 定义一个类属性 init_flag 标记是否 执行过初始化动作,初始值为 False
  2. __init__ 方法中,判断 init_flag,如果为 False 就执行初始化动作
  3. 然后将 init_flag 设置为 True
  4. 这样,再次 自动 调用 __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面向对象的知识梳理的更多相关文章

  1. Python 面向对象基础知识

    面向对象基础知识 1.什么是面向对象编程? - 以前使用函数 - 类 + 对象 2.什么是类什么是对象,又有什么关系? class 类: def 函数1(): pass def 函数2(): pass ...

  2. Python面向对象基础知识

    面向对象是一种编程方式,此编程方式的实现是基于对类和对象的使用 类是一个模板,模板中包装了多个“函数”供使用(可以讲多函数中公用的变量封装到对象中) 对象,根据模板创建的实例(即:对象),实例用于调用 ...

  3. Python面向对象相关知识1

    1. python是动态的语言,这样在使用类的时候,类的属性就可以随意的添加,但是这样在实际开发中有一定的缺陷,所以,可以在类中定义一个特殊的__init__()方法,当创建实例时,__init__( ...

  4. #5 Python面向对象(四)

    前言 本节将是Python面向对象的最后一篇博文了,这节将记录类的特殊方法.特殊成员方法.旧类和新类的不同,以及一些其他知识.Go! 一.类的特殊方法 Python有三种特殊方法:实例方法.静态方法. ...

  5. python反射和面向对象的知识并简述基本的异常

    # 1.面向对象不是所有的情况都适用# 2.面向对象编程# a.定义类# class Foo:# def 方法1(self,bb):# b.根据类创建对象(创建) # class Person():# ...

  6. python面向对象重新梳理

    关于本篇博文: 面向对象中所有的内容的重新梳理,其实面向对象的知识早在一个多月前就学习过并整理过,但是发现还是有所欠缺,故在此以极其简介的语言风格重新梳理一遍 面向对象详细介绍:http://www. ...

  7. python 面向对象初级篇

    Python 面向对象(初级篇) 概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发" ...

  8. python面向对象进阶(八)

    上一篇<Python 面向对象初级(七)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使 ...

  9. python面向对象初级(七)

    概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发“更快更好更强...” 面向过程编程最易被初学 ...

随机推荐

  1. 医学图像数据(三)——TCIA部分数据下载方式

    前为止,本人还没有找到不需要账号的就可以部分下载的方式,因此这里讲的是需要注册账号下载部分数据的方法. 注意:下载部分数据需要注册账号 注册账号网址:https://public.cancerimag ...

  2. java学习笔记09-类与对象

    物以类聚,人以群分,我们把具有相似特性或品质的物体归为一类. 类:类是一种模板,它描述一类对象的行为和状态. 对象:对象是类的一个实例,有状态和行为. 比如在一支nba球队中,每个球员都有球衣号码,场 ...

  3. 一、学习起步vue——安装

    学习vue第一步:安装 (windows系统) 整个运行的命令:  npm -v node -v 查看版本 npm uninstall -g vue-cli 卸载vue-cli npm install ...

  4. JVM学习资料

      java虚拟机学习-深入理解JVM(1) java虚拟机学习-慢慢琢磨JVM(2) java虚拟机学习-慢慢琢磨JVM(2-1)ClassLoader的工作机制 java虚拟机学习-JVM内存管理 ...

  5. docker基础命令汇总

    搜索镜像 docker search 镜像名称 例如:docker search centos7 下载镜像 docker pull 镜像名称 例如:docker pull centos7 启动容器 d ...

  6. vue修改项目名

    1.修改config/index.js文件 2.修改Router内容 vue跨域设置

  7. C# Winform无边框窗口拖动

    Windows 的 API 代码如下: [DllImport("user32.dll")] public static extern bool ReleaseCapture(); ...

  8. windows配置ssh免密登录linux

    客户端(windows)要做的事情 默认机器上已安装git,若没有,请先安装git 查看本地是否有ssh公钥文件夹,若没有,则创建文件夹 mkdir ~/.ssh //创建文件夹 生成公钥 邮箱最好为 ...

  9. Jmeter中基本操作

    Jmeter中基本操作包括 1:线程组 2:HTTP信息头管理器 3:HTTP请求默认值 4:HTTP请求 5:查看结果树 操作步骤如下: 1.创建一个线程组 通俗的讲一个线程组,,可以看做一个虚拟用 ...

  10. jquery的选择器——[作为学习备用]

    1,转载:https://www.cnblogs.com/onlys/articles/jQuery.html jQuery 的选择器可谓之强大无比,这里简单地总结一下常用的元素查找方法 $(&quo ...