Python 面向对象编程详解:从类与对象到动态属性方法

一、前言

在 Python 学习过程中,面向对象编程(Object Oriented Programming,简称 OOP)是一个非常重要的知识点。

Python 不仅支持面向过程编程,也支持面向对象编程。对于简单的小程序,我们可以使用函数快速完成任务;但是当项目规模扩大,代码越来越复杂时,面向对象思想能够帮助我们更好地组织代码,提高程序的复用性和维护性。

本文将详细介绍 Python 面向对象编程中的核心知识:

  • 什么是面向对象
  • 类和对象的关系
  • 如何创建类和对象
  • self 的作用
  • 属性和方法的区别
  • 类方法、静态方法
  • 动态添加属性和方法

二、面向过程 VS 面向对象

Python 是一种支持多种编程范式的语言,既可以采用面向过程,也可以采用面向对象方式开发。

1. 面向过程编程

面向过程(Procedural Programming)是一种以过程为核心的编程思想。

它关注:

完成一个任务需要哪些步骤,然后按照步骤执行。

例如:

实现"把大象装进冰箱":

python 复制代码
def open_door():
    print("打开冰箱门")


def put_elephant():
    print("把大象装进去")


def close_door():
    print("关闭冰箱门")


open_door()
put_elephant()
close_door()

这种写法比较直观。

但是如果需求变复杂:

  • 不同品牌冰箱
  • 不同容量冰箱
  • 多个冰箱对象

代码会越来越混乱。


2. 面向对象编程

面向对象(Object Oriented Programming)关注的是:

程序中有哪些对象,以及对象之间如何交互。

例如:

冰箱就是一个对象。

我们可以定义一个冰箱类:

python 复制代码
class IceBox:

    def __init__(self, brand):
        self.brand = brand
        self.door_open = False


    def open_door(self):
        self.door_open = True
        print("冰箱门打开")


    def put_elephant(self, food):
        if self.door_open:
            print(f"{food}放入冰箱")
        else:
            print("请先打开冰箱")


    def close_door(self):
        self.door_open = False
        print("冰箱门关闭")


box = IceBox("小米")

box.open_door()
box.put_elephant("大象")
box.close_door()

相比面向过程:

  • 数据和操作进行了封装
  • 代码结构更加清晰
  • 更方便扩展

这就是面向对象中的重要思想:

封装


三、类和对象

类和对象是面向对象编程最核心的两个概念。

1. 类(Class)

类是对一类事物的抽象。

例如:

现实世界:

复制代码
学生

抽象成程序:

python 复制代码
class Student:
    pass

类描述:

  • 对象有什么属性
  • 对象有什么行为

例如:

学生:

属性:

复制代码
姓名
年龄
学号

方法:

复制代码
学习
考试
休息

类就是创建对象的模板。


2. 对象(Object)

对象是类创建出来的具体实例。

例如:

类:

复制代码
学生

对象:

复制代码
张三
李四
王五

代码:

python 复制代码
class Student:
    pass


s1 = Student()
s2 = Student()

这里:

Student

是类。

s1

s2

是对象。

对象具有:

  • 属性
  • 方法
  • 唯一标识

四、Python如何定义类

基本语法

python 复制代码
class 类名:

    类体

例如:

python 复制代码
class Person:

    pass

Python 中类名通常使用:

大驼峰命名法

例如:

python 复制代码
StudentInfo

UserAccount

CarFactory

五、init 初始化方法

__init__() 是 Python 中非常重要的方法。

作用:

创建对象后自动执行,用于初始化对象数据。

例如:

python 复制代码
class Person:

    def __init__(self,name):

        self.name = name



p = Person("张三")

print(p.name)

输出:

复制代码
张三

创建对象:

python 复制代码
Person("张三")

会自动执行:

python 复制代码
__init__()

六、self到底是什么?

很多 Python 初学者都会疑惑:

为什么方法里面必须写 self?

例如:

python 复制代码
class Person:

    def eat(self):
        print("吃饭")

这里:

self

代表:

当前对象本身

例如:

python 复制代码
p = Person()

p.eat()

实际上等价于:

python 复制代码
Person.eat(p)

调用实例方法时,对象会自动作为第一个参数传入。


七、类属性和实例属性

Python 中属性分为:

  1. 类属性
  2. 实例属性

1. 类属性

类属性:

定义在类里面,方法外面。

例如:

python 复制代码
class Person:

    country="China"

访问:

python 复制代码
print(Person.country)

所有对象共享。

例如:

python 复制代码
p1=Person()
p2=Person()

print(p1.country)
print(p2.country)

输出:

复制代码
China
China

2. 实例属性

实例属性属于对象自己。

通过:

python 复制代码
self.xxx

定义。

例如:

python 复制代码
class Person:

    def __init__(self,name,age):

        self.name=name
        self.age=age

创建:

python 复制代码
p1=Person("张三",18)

p2=Person("李四",20)

两个对象拥有不同的数据。


八、Python中的三种方法

Python 类中主要有:

  1. 实例方法
  2. 类方法
  3. 静态方法

1. 实例方法

特点:

  • 第一个参数是 self
  • 可以访问实例属性
python 复制代码
class Person:


    def eat(self):

        print("吃饭")


p=Person()

p.eat()

2. 类方法

使用:

python 复制代码
@classmethod

第一个参数:

python 复制代码
cls

示例:

python 复制代码
class Person:

    country="China"


    @classmethod
    def show(cls):

        print(cls.country)


Person.show()

3. 静态方法

使用:

python 复制代码
@staticmethod

特点:

  • 不访问实例属性
  • 不访问类属性

例如工具函数:

python 复制代码
class Math:


    @staticmethod
    def add(a,b):

        return a+b


print(Math.add(1,2))

九、特殊方法(魔法方法)

Python 中:

双下划线开头和结尾的方法:

称为:

魔法方法

例如:

init

初始化对象

str

控制 print 输出

repr

控制解释器显示

del

对象销毁

例如:

python 复制代码
class Person:


    def __str__(self):

        return "Person对象"

十、动态添加属性和方法

Python 是动态语言。

对象创建后,也可以动态增加内容。


添加对象属性

python 复制代码
class Person:

    pass


p=Person()


p.name="张三"

print(p.name)

添加类属性

python 复制代码
Person.age=18

动态添加方法

需要使用:

python 复制代码
types.MethodType

例如:

python 复制代码
import types


def eat(self):

    print("吃饭")


p.eat=types.MethodType(eat,p)


p.eat()

十一、__slots__限制属性

默认情况下:

Python 对象可以随意添加属性。

例如:

python 复制代码
p.age=18

p.height=180

但是有时候我们希望限制属性。

可以使用:

python 复制代码
__slots__

例如:

python 复制代码
class Person:

    __slots__=("name","age")

这样:

允许:

python 复制代码
p.name="张三"

p.age=18

禁止:

python 复制代码
p.weight=70

十二、总结

本文详细介绍了 Python 面向对象编程的重要知识:

知识点 说明
对象的模板
对象 类创建出来的实例
self 当前对象本身
init 初始化方法
类属性 所有对象共享
实例属性 对象独有
实例方法 操作对象
类方法 操作类
静态方法 工具函数
魔法方法 特殊行为控制
动态属性 运行时添加
slots 限制属性

掌握面向对象,是学习 Python 高级开发的重要基础。

后续学习:

  • 继承
  • 多态
  • 封装
  • 抽象类
  • 设计模式

都会建立在这些基础知识之上。

相关推荐
微小冷1 小时前
Python CasADi初步教程
python·控制·模型预测·casadi·符号表达式·sx
cpolar技术支持1 小时前
requirements.txt 能安装不等于安全:用 pip-audit 检查 Python 依赖,cpolar 临时分享脱敏报告
python·cpolar·requirements·依赖安全·pip-audit
大牧师1 小时前
Nest.js 微服务入门教程
开发语言·javascript·后端·微服务·node.js·nest.js·nest
格林威2 小时前
C# 图像异步落盘存储:基于Channel 配合 ArrayPool 实现异步落盘
开发语言·人工智能·数码相机·机器学习·计算机视觉·c#·视觉检测
软件黑马王子2 小时前
11.缓存池优化:窗口布局
开发语言·前端框架·c#
深圳市益普科技有限公司2 小时前
半导体MES的数字孪生:虚拟调试如何把上线风险提前清零
java·开发语言
低代码布道师2 小时前
外包项目管理平台全栈实战课02搭建数据底座:Next.js + PostgreSQL + Prisma 7
开发语言·javascript·postgresql·全栈开发
格林威2 小时前
C# 图像使用AVX2指令集:使用OpenCvSharp实现字节图像解压缩速度和map_image算子速度提升
开发语言·图像处理·人工智能·计算机视觉·c#·视觉检测·工业相机