基本理论

什么是对象

万物皆对象

对象是具体的事物

  • 拥有属性、行为
  • 把许多零散的东西,封装成为一个整体

Python中一切东西都是对象,Python是一门特别彻底的面向对象编程语言(OOP)

其他编程语言很多还分基本类型和对象类型,而在python中,只有对象类型

面向过程 & 面向对象

两者都是解决问题的思路、思想,面向对象本身是面向过程的封装

  • 面向过程:在解决问题的时候,关注的是解决问题的每一个过程(步骤)

    • 按照步骤划分
    • 摆一个任务,分解成具体的每一个步骤
  • 面向对象:在解决问题的时候,关注的是解决问题所需要的对象
    • 按照功能对象进行划分
    • 找到对象,确定对象属性和行为
  • 如何从面向过程到面向对象:
    • 列举任务步骤
    • 分离步骤中的对象和功能代码块
    • 将功能代码划分到具体对象中
    • 根据对象以及具体的行为,抽取出类

什么是类

类是某一类具体对象特征的抽象

类的作用

根据抽象的类,生产具体的对象

类的组成

名称、属性、方法

注意:

  • 属性和方法,都是抽象的概念
  • 在产生对象之后,对象才拥有具体的属性值,和方法实现

对象和类的关系

对象 -- 抽象 -- 类

类 -- 实例化 -- 对象

定义类

经典类的定义:

class 类名:
......

创建一个对象

obj = 类名()

创建对象时的底层运作:

  • 首先会在内存中开辟一段空间(类的定义也会占用内存)
  • 通过类变量获取类名:xxx.__name__
  • 通过对象获取类:xxx.__class__

属性相关

属性和变量的区别

概念:

  • 变量是:可以改变的值
  • 属性是:属于某个对象的特征

访问权限:

  • 变量:根据作用域不同,存在不同的访问权限
  • 属性:只能通过对象来进行访问
    • 对象也是通过变量来引用,也同样有作用域权限

判断依据:

  • 宿主是否存在

添加属性

  1. 直接通过对象,动态添加

    • 语法:对象.属性 = 值
  2. 通过类的初始化方法(构造方法)
    • __init__()

增加了一个属性之后,内存中先开辟一段空间存储属性值,然后在对象的空间里存储这个值对象的引用变量

访问属性

直接通过对象.属性 访问

python提供了一个 __dict__ 属性,是一个字典,里面包含了现在这个对象里的所有属性

修改属性

修改属性值:对象.属性 = 值

删除属性

del 对象.属性

类属性

增加类属性:

  • 类名.属性 = 值
  • 在类中,直接写 属性 = 值

查看类属性:

  • 类名.属性
  • 类属性也可以通过对象来访问:对象.类属性
  • 对象属性查找机制:
    • 优先到对象自身去查找属性,找到则结束
    • 如果没找到,则根据__class__找到对象对应的类,找这个类的属性

修改类属性:

  • 通过类名进行修改:类名.属性 = 值
  • 对象.__class__.属性 = 值
  • 注意:不能直接通过对象进行修改! 对象.属性 = xxx 是对象的增加属性和修改属性的语法

查看所有类属性:类名.__dict__

删除类属性:

  • del 类名.属性
  • 不能通过对象删除,del只能删除对象的直系属性

类属性的内存存储问题:

  • 属性都存储在一个字典中,这个字典是实际存在的,可以通过 __dict__ 进行访问
  • 类.__dict__是一个只读属性
  • 总结:
    • 一般情况下,属性存储在 __dict__ 这个字典中,有些内置对象没有这个属性
    • 一般对象可以直接修改 __dict__ 属性
    • 但是类对象的 __dict__ 是只读的,默认无法修改,可以通过setattr的方法修改

类属性被各个对象共享

限制对象可以添加的属性

在类中写上:__slots__ = [......]

后续通过类创建的对象,都只能添加指定的属性

方法相关

类中方法定义概述

描述一个目标的行为动作

和函数非常类似:

  • 都封装了一系列行为动作
  • 都可以在被调用之后,执行一系列行为动作
  • 最主要的区别就是:调用方式

方法的划分:

  • 实例方法:默认第一个参数需要接收到一个实例
  • 类方法:默认第一个参数需要接收到一个类
  • 静态方法:第一个参数什么也不接收

注意:

  • 划分依据是:方法的第一个参数
  • 不管是哪一种方法,都是存储在类中的
  • 不同类型方法的调用方式不同

定义方法

定义实例方法:

class A:
def shili(self):
pass

定义类方法:

class A:
@classmethod
def lei(cls):
pass

定义静态方法:

class A:
@taticmethod
def jingtai():
pass

调用方法

a = A()

a.shili() # 调用实例方法
A.lei() # 调用类方法
a.lei() # 实例也可以调用类方法
A.jingtai() # 静态方法也是通过类调用

不管是自己传递,还是解释器帮我们处理,最重要保证不同类型的方法第一个参数接收到的是它们想要的类型

实例方法

类方法

静态方法

不同类型方法中访问不同类型的属性

Python:面向对象基础的更多相关文章

  1. Python 面向对象 基础

    编程范式概述:面向过程 和 面向对象 以及函数式编程 面向过程:(Procedure Oriented)是一种以事件为中心的编程思想. 就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现 ...

  2. python面向对象基础

    面向对象基础 1. 简述 编程方式: 面向过程: 根据代码在脚本的堆叠顺序,从上到下依次执行 函数式编程:将相同功能的代码封装到函数中,直接调用即可,减少代码重复性 面向对象:对函数进行分类和封装,将 ...

  3. Python 面向对象基础知识

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

  4. python 面向对象基础和高级复习

    面向对象基础 面向对象编程 面向过程编程:类似于工厂的流水线 优点:逻辑清晰 缺点:扩展性差 面向对象编程:核心是对象二字,对象属性和方法的集合体,面向对象编程就是一堆对象交互 优点:扩展性强 缺点: ...

  5. 十六、python面向对象基础篇

    面向对象基础: 在了解面向对象之前,先了解下变成范式: 编程范式是一类典型的编程风格,是一种方法学 编程范式决定了程序员对程序执行的看法 oop中,程序是一系列对象的相互作用 python支持多种编程 ...

  6. 1.Python面向对象基础

    面向对象(OOP) 面向对象编程--object oriented programming 简写 OOP   面向过程和面向对象的区别: 面向过程: 1.把完成某一个需求的所有步骤从头到尾逐步实现 2 ...

  7. [python面向对象]--基础篇

    1.#类 #类就是一个模板,模板里可以包含多个函数,函数里实现一些功能 #定义一个类 class bar: def foo(self,agr): print(self,agr) obj = bar() ...

  8. Python面向对象基础:编码细节和注意事项

    在前面,我用了3篇文章解释python的面向对象: 面向对象:从代码复用开始 面向对象:设置对象属性 类和对象的名称空间 本篇是第4篇,用一个完整的示例来解释面向对象的一些细节. 例子的模型是父类Em ...

  9. Python面向对象基础一

    公司可能过一两个月就要从深圳搬到东莞松山湖,项目组的现在有的在转Java或其他语言的,问我们要不要转java+hoodap+spark方向,我还是先不转,毕竟之前是从ios转回C#,这现在在转其他的那 ...

  10. python面向对象基础-01

    面向对象(OOP)基本概念 前言 话说三国时期曹军于官渡大败袁绍,酒席之间,曹操诗兴大发,吟道:喝酒唱歌,人生真爽! 众将直呼:"丞相好诗",于是命印刷工匠刻板印刷以流传天下; 待 ...

随机推荐

  1. javaSE--基础02

    本章目标 一. 运算符★赋值运算符关系运算符逻辑运算符  三元运算符 二. 进制与位运算符[选学]   三. 流程控制结构 √ 四. 顺序结构 √  五. 分支结构★     六. 循环结构★ 七. ...

  2. P1582 倒水(贪心 + lowbbit)

    https://www.luogu.com.cn/problem/P1582 #include <bits/stdc++.h> using namespace std; #define i ...

  3. 题解【SP1716】GSS3 - Can you answer these queries III

    题目描述 You are given a sequence \(A\) of \(N (N <= 50000)\) integers between \(-10000\) and \(10000 ...

  4. 生产环境设置mysql主从复制

    Slave服务器的版本要等于或者高于master服务器 现在的实例是在mysql 5.7上的主从配置 a) master服务器的my.cnf配置,server_id 推荐用IP的后两位数字 [mysq ...

  5. selenium-JavaScript的处理

    JavaScript的处理 在自动化过程中,遇到js处理的元素,需要使用js语言对元素进行操作,例如,滑动到浏览器的底部或者顶部,时间控件的处理,元素可见不可见以及富文本的处理等,都需要js语言的支持 ...

  6. 每天进步一点点------创建Microblaze软核(三)

    第七步 进入SDK开发环境编译完成后弹出如下对话框,选择SDK的工作目录.在MicroblazeTutor中创建一个Workspace文件夹,并选择该文件夹为SDK的工作目录.进入SDK主界面.第八步 ...

  7. linux服务器上部署springboot项目,并让他持续运行到后台

    我们知道在运行springboot 项目只需要java -jar + 项目的war包(jar包)名. 但是只要终端已停止那么服务就会被关闭,也就无法访问到我们的项目了.所以我们可以使用守护进程的方式来 ...

  8. thinkphp的同步上传图片和异步上传图片

    同步: 前台页面: <div class="form-div"> <form action="{:url('index/i/edit_head_img_ ...

  9. Bugku-CTF加密篇之affine(y = 17x-8 flag{szzyfimhyzd})

    affine y = 17x-8 flag{szzyfimhyzd} 答案格式:flag{*} 来源:第七届山东省大学生网络安全技能大赛  

  10. IPSec无法建立?注意第一阶段hash sha !

    该篇注意记录一下,有些情况下,我们配置了IPSec ,但是就是无法建立,发现连第一阶段都无法建立起来. 1.检查配置无问题 2.开启debug crypto isakmp发现有IKE的重传 3.sho ...