Python:面向对象基础

基本理论

什么是对象

万物皆对象

对象是具体的事物

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

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() # 静态方法也是通过类调用

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

实例方法

类方法

静态方法

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

猜你喜欢

转载自www.cnblogs.com/wbyixx/p/12231568.html