当前位置:

首页 > 编程开发 > Python面向对象编程初学者指南

Python面向对象编程初学者指南

本文目录

    前言面向对象:采用基于对象(实体)的概念建立模型,模拟客观世界分析、设计、实现软件的办法。面向对象编程(Object-orientedProgramming,简称OOP)是一种解决软件复用的设计和编程方法,把软件系统中相近相似的操作逻辑和操作应用数据、状态,以类的形式描述出来,以对象实例的形式在软件系统中复用,提高软件开发效率。面向对象编程是Python中一个极为重要的概念。一、面向对象和面向过程1.两类软件开发设计方法面向过程编程:根据业务逻辑从上往下,将需要用到的功能代码封装到函数中,着重关

    前言

    面向对象 : 采用基于对象(实体) 的概念建立模型,模拟客观世界分析、设计、实现软件的办法。面向对象编程(Object-oriented Programming,简称 OOP)是一种解决软件复用的设计和编程方法,把软件系统中相近相似的操作逻辑和操作应用数据、状态,以类的形式描述出来,以对象实例的形式在软件系统中复用,提高软件开发效率。

    面向对象编程是Python中一个极为重要的概念。

    一、面向对象和面向过程

    1.两类软件开发设计方法

    1. 面向过程编程:根据业务逻辑从上往下,将需要用到的功能代码封装到函数中,着重关注开发的步骤和过程,典型代码为C语言(关注过程)
    2. 面向对象编程:将函数或所需要的功能进行分类和封装,着重关注具体哪个类和函数来实现功能,典型代码为Java、C++等语言(关注结果)

    2.面向对象相关术语

    • 类(Class):用来描述具有相同属性和方法的对象的集合,它定义了该集合中每个对象所共有的属性和方法,对象是类的实例。
    • 实例:也称对象。通过类定义的初始化方法,赋予具体的值,成为一个”有血有肉的实体”。
    • 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
    • 数据成员:类变量或者实例变量, 用于处理类及其实例对象的相关的数据。
    • 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
    • 局部变量:定义在方法中的变量,只作用于当前实例的类。
    • 实例变量:在类的声明中,属性是用变量来表示的。这种变量就称为实例变量,是在类声明的内部但是在类的其他成员方法之外声明的。
    • 方法:类中定义的函数。
    • 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重 写。
    • 静态方法:不需要实例化就可以由类执行的方法。
    • 类方法:类方法是将类本身作为对象进行操作的方法。

    面向对象三大特性:

    • 封装:将内部实现包裹起来,对外透明,提供api接口进行调用的机制。
    • 继承:即一个派生类(derived class)继承父类(base class)的变量和方法。
    • 多态:根据对象类型的不同以不同的方式进行处理。

    二、类和对象

    1.对象

    对象是面向对象编程的核心,在使用对象过程中,为了将具有共同特征和行为的一组对象抽象定义,形成类

    2.类

    1)概念

    类是一类事物,对象即是这一类事物的具体实现,类具有相同的属性和行为

    2)类(class)的组成

    • 类名:类的名称
    • 属性:事物的特征
    • 方法:具体做什么

    3)抽象

    拥有相同或类似属性和行为的对象都可以抽象成一个类

    4)类的分类

    创建类使用class关键字,带上类名,再带上括号,括号内为object,这样的类称为:新式类;也可以不带括号和括号内的object,这样的类称为:经典类。

    # 新式类 
    class Meeting2(object): 
    pass 
    # 经典类 
    class Meeting2: 
    pass

    5)创建对象

    A = Meeting1() 
    B

    6)self

    类方法的第一个参数必须是self(按惯例是self,也可以是其他名称),调用时不必传入。self代表类的实例

    三、获取或添加对象属性

    如下有个名为meeting的类,类中初始化了name、age、sex、address、attack等属性,定义了introduction和attacked两个方法:

    class Meeting(object):
    """meeting类的类描述"""
    
    def __init__(self, name, age, sex, address, attack):
    """构造函数"""
    self.name = name
    self.age = int(age)
    self.sex = sex
    self.address = address
    self.attack = int(attack)
    
    def introduction(self):
    print("姓名:{}".format(self.name))
    print("年龄:{}".format(self.age))
    print("性别:{}".format(self.sex))
    print("地址:{}".format(self.address))
    
    def attacked(self):
    print(f"{self.name}正在向您发起攻击,攻击力为{self.attack}!")
    
    def foreign_fun():
    print("我是外部函数")

    1.hasattr-检查对象是否包含指定属性或方法

    用法:

    hasattr(object,name)

    作用:检查对象中是否包含指定属性或方法

    返回值:存在返回true、不存在返回false

    # 实例化meeting类
    Meeting = Meeting("张三", 20, "男", "南京", 108)
    
    # 获取Meeting对象中是否存在name属性
    print(hasattr(Meeting, "name"))# True
    # 获取Meeting对象中是否存在mobile属性
    print(hasattr(Meeting, "mobile"))# False
    # 获取Meeting对象中是否存在attacked方法
    print(hasattr(Meeting, "attacked"))# True

    2.getattr-获取对象中指定属性的属性值

    用法:

    getattr(object,name[,default])

    作用:获取对象中指定属性的属性值

    返回值:若存在,则返回该属性的属性值;若不存在,则返回指定内容

    # 实例化meeting类
    Meeting = Meeting("张三", 20, "男", "南京", 108)
    
    # 获取Meeting对象中name属性的属性值
    print(getattr(Meeting, "name"))# 张三
    # 获取Meeting对象中kills属性或方法的值,若不存在则返回指定内容
    print(getattr(Meeting, "kills", "未找到kills方法或属性"))# 未找到kills方法或属性
    # 获取Meeting对象中attacked方法,返回值为函数地址
    print(getattr(Meeting, "attacked"))
    # 使用getattr方法可以直接调用Meeting对象中的方法
    f = getattr(Meeting, "attacked")
    f()

    打印结果如下:

    Python面向对象编程初学者指南

    3.setattr-为object对象的name属性设置指定value

    用法:

    setattr(object,name,value)

    作用:为object对象的指定属性设置指定value

    返回值:

    # 实例化meeting类
    Meeting = Meeting("张三", 20, "男", "南京", 108)
    
    # 将对象中name属性的值改为“刘德华”
    setattr(Meeting, "name", "刘德华")
    # 获取对象中name的属性值
    print(getattr(Meeting, "name"))# 刘德华
    # 将对象外部的名为foreign_fun的方法引入对象内部,并重新命名为“new_foreign_fun”
    setattr(Meeting, "new_foreign_fun", foreign_fun)
    # 获取对象中是否存在foreign_fun的属性或方法,返回值为True或False
    print(hasattr(Meeting, "foreign_fun"))# False
    # 获取对象中是否存在new_foreign_fun的属性或方法,返回值为True或False
    print(hasattr(Meeting, "new_foreign_fun"))# True

    打印结果如下:

    Python面向对象编程初学者指南

    四、魔法方法

    1.__init__() 构造函数

    __init__()方法是Python中一种特殊的方法,被称为构造函数或初始化方法,当创建这个类的实例时就会调用该方法。

    class Meeting(object):
    """meeting类的类描述"""
    
    def __init__(self, name, age, sex, address, attack):
    """构造函数"""
    self.name = name
    self.age = int(age)
    self.sex = sex
    self.address = address
    self.attack = int(attack)
    
    C = Meeting("张三", 20, "男", "南京", 108)
    print(C.name)# 张三
    print(C.address)# 南京

    2.__del__() 析构函数

    当删除对象时,Python解释器会默认调用一个方法__del__(),相当于unittest框架中的tearDown()函数

    def __del__(self): 
    """析构函数""" 
    print("%s攻击结束" % (self.name)) 

    每调用一次对象,都会执行一次__del__()方法

    Python面向对象编程初学者指南

    3.引用计数

    D = Meeting("张三", 20, "男", "南京", 108)
    # 计算当前实例引用计数,D引用一次,sys.getrefcount(D)引用一次
    print(sys.getrefcount(D))# 2

    D对象的引用计数为2次,一次是D引用,一次是sys.getrefcount所引用的

    4.__str()__字符串函数

    __str__方法需要返回一个字符串,当做这个对象的描述信息,当使用print输出对象的时候,只要定义了__str__(self)方法,那么就会打印这个方法返回的数据

    def __str__(self):
    """字符串函数"""
    return "我是Meeting类的字符串描述"
    # __str__():字符串函数,定义__str__()方法时,打印对象,打印的是__str__()方法的返回值,否则打印类的内存地址
    print(D)# 我是Meeting类的字符串描述
    • 未定义__str__()方法时,打印对象,打印的是Meeting类的内存地址:<__main__.Meeting object at0x014A7748>
    • 定义了__str__()方法后,打印对象,打印的是__str__()方法的返回值:我是Meeting类的字符串描述

    五、Python的内置属性

    1.__dict__:获取类的属性

    获取类的属性,包含一个字典,由类的数据属性组成

    # __dict__:获取类的属性,返回值为字典类型 
    print(D.__dict__) 
    # {'name': '张三', 'age': 20, 'sex': '男', 'address': '南京', 'attack': 108} 

    2.__doc__:获取类的文档字符串

    class Meeting(object): 
     """meeting1类的类描述""" 
     
    # __doc__:获取类的文档字符串 
    print(D.__doc__) # meeting1类的类描述 

    3.__name__:获取类名

    # __name__:获取类名 
    print(Meeting.__name__) # Meeting 

    4.__module__:类定义所在的模块

    类的全名是'__main__.clssName',如果类位于一个导入模块mymod中,那么className.__module__等于mymod

    from common.http_requests import HttpRequests
    # __module__:类定义所在的模块
    print(Meeting.__module__)# __main__
    print(HttpRequests.__module__)# common.http_requests

    Meeting类的路径为__main__,而从common文件的http_requests文件中导入了HttpRequests类,打印其路径,则为common.http_requests

    5.__bases__:获取类的所有父类构成元素

    获取类的所有父类构成元素(包含了一个由所有父类元素组成的元组)。例如下面有一个Song类,其继承了父类Music,则获取到的Song类的所有父类构成元素为:(,)

    class Music(object):
    pass
    
    class Song(Music):
    pass
    
    print(Song.__bases__)# (,)

    小结

    本篇文章我们介绍了面向对象的相关概念,下面来简单总结一下:

    面向对象相关概念:

    • 类和对象:类是一类事物,对象即是这一类事物的具体实现,类具有相同的属性和行为;
    • 类的组成:类名、属性、方法
    • 带object的为新式类,不带object的为经典类

    获取或添加对象属性:

    • hasattr:检查对象是否包含指定属性或方法
    • getattr:获取对象中指定属性的属性值
    • setattr:为object对象的name属性设置指定value

    魔法方法:

    • __init__() 构造函数:又叫初始化方法,用来初始化一些成员变量
    • __del__() 析构函数:每调用一次对象,都会执行一次__del__()方法,相当于Unittest框架中的tearDown
    • __str()__字符串函数:返回一个字符串,当做这个对象的描述信息

    Python内置属性:

    • __dict__:获取类的属性,返回值为字典类型
    • __doc__:获取类的文档字符串
    • __name__:获取类名
    • __module__:类定义所在的模块
    • __bases__:获取类的所有父类构成元素,返回类型为元组
    本文内容来源于网友投稿,如有侵权请联系删除。
    作者最新文章
    编程开发 Python
    相关文章 更多
    链表删除节点的时间复杂度是多少及其详细分析
    链表删除节点的时间复杂度是多少及其详细分析

    详细分析链表删除节点的时间复杂度,深入探讨单链表与双向链表在不同已知前提下的查找与删除开销,并结合完整代码与清晰图解进行对比总结。

    codex如何配置模型参数及文件设置教程
    codex如何配置模型参数及文件设置教程

    想知道如何让AI写出的代码更贴合你的习惯?本文手把手教你在VS Code中调整Codex相关模型参数,通过修改配置文件优化温度值和令牌限制,解决代码建议不准确或响应慢的问题。

    Claude Code AI编程工具实力揭秘与编程助手实测
    Claude Code AI编程工具实力揭秘与编程助手实测

    通过实测展示Claude Code在终端中如何理解自然语言指令、自动修改代码文件并处理复杂编程任务,帮助开发者评估其实际辅助能力。

    winforms教程自学入门与基础开发步骤详解
    winforms教程自学入门与基础开发步骤详解

    本教程详细讲解如何使用Visual Studio创建WinForms项目,通过添加按钮和标签控件并编写点击事件代码,实现一个基础的计数器功能,适合C#初学者快速上手Windows窗体应用开发。

    Cursor自动补全设置教程教你快速开启代码补全功能
    Cursor自动补全设置教程教你快速开启代码补全功能

    详解Cursor编辑器中自动补全功能的开启与优化设置,涵盖Tab触发机制、上下文窗口调整及模型切换,帮助开发者解决补全延迟、干扰大等问题,提升编码流畅度。

    pandas的数据格式怎么转换和设置方法教程
    pandas的数据格式怎么转换和设置方法教程

    详解Pandas中数据格式转换的核心方法,包括astype强制转换、to_numeric容错处理及日期解析技巧,解决常见类型错误并提升数据处理效率。

    VS Code中文设置方法 简体语言包安装与切换教程
    VS Code中文设置方法 简体语言包安装与切换教程

    详细介绍在Visual Studio Code中安装Chinese (Simplified)语言包的方法,包括通过扩展市场搜索、安装及自动重启切换至简体中文界面的完整步骤,帮助开发者快速将编辑器本地化。

    cursor安装过程无法更改安装位置的解决方法
    cursor安装过程无法更改安装位置的解决方法

    针对Cursor安装包默认锁定C盘且无路径选择界面的问题,提供通过手动移动文件并创建目录联结(Symbolic Link)的解决方案,实现将软件安装在其他磁盘分区。

    rust下载安装教程详解及Windows环境配置方法
    rust下载安装教程详解及Windows环境配置方法

    详解Windows系统下Rust语言的安装步骤,重点解析rustup工具链管理机制,解决环境变量配置错误及MSVC链接器缺失问题,提供可复制的命令验证方法与常见报错的因果排查思路。

    vs code怎么配置 chat实用设置教程步骤
    vs code怎么配置 chat实用设置教程步骤

    详解VS Code中Chat插件的安装与核心配置步骤,重点解决API连接失败、响应慢等常见问题,通过优化上下文设置提升代码生成质量,适合希望集成AI辅助工具的开发者阅读。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    macOS软件
    macOS软件

    正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

    Mac软件 更多
    Blender
    Blender
    Windows、macOS 和 Linux

    Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。

    灵活计算器
    灵活计算器
    macOS/iOS/Android

    灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

    赤友清理大师
    赤友清理大师
    macOS

    赤友清理大师是一款为 Mac 设计的智能清理优化工具,可精准扫描垃圾、大文件、重复文件等,释放磁盘空间。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

    WINDOWS 更多
    Blender
    Blender
    Windows、macOS 和 Linux

    Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。

    Windows 10
    Windows 10
    Windows

    Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

    极度公式
    极度公式
    Windows/macOS/Linux

    极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。