Python 面向对象编程(OOP)零基础全教程

简介: 本教程来源:http://dnuhf.cn深入浅出讲解Python面向对象编程(OOP):从类与对象的本质区别(模板vs实例),到属性、方法、构造函数`__init__`;涵盖封装(私有属性)、继承(代码复用)、多态(统一接口不同实现)三大特性,以及类方法、静态方法等核心概念,配大量生活化示例和可运行代码,零基础也能轻松掌握。

在 Python 里,你之前学的变量、列表、字典,都属于数据;函数属于行为。而对象(Object) 就是把数据 + 行为打包在一起的东西。

面向对象编程(OOP)是现代编程最重要的思想之一,它让代码更清晰、更好复用、更容易维护。不管是做游戏、网站、数据分析还是自动化,都离不开对象。

这篇教程从最基础讲起,不讲复杂术语,让你真正学会 Python 类、对象、属性、方法、继承、封装。


一、什么是对象?什么是类?

1. 直观理解

  • 类(Class):相当于设计图纸 / 模板。比如 “学生”“手机”“汽车” 是一类东西。
  • 对象(Object):根据图纸造出来的具体实例。比如 “张三同学”“你的手机”“楼下那辆特斯拉”。

一句话:

类是模板,对象是根据模板造出来的具体东西。

2. 生活中的例子

  • 类:手机
  • 属性:品牌、颜色、内存
  • 方法:打电话、发微信、拍照
  • 对象:你的手机
  • 品牌 = 华为
  • 颜色 = 白色
  • 可以执行打电话 ()

3. 程序里的结构

plaintext

类(Class)
├── 属性(变量):存储数据
└── 方法(函数):执行操作

二、定义一个最简单的类

class 关键字定义类,类名一般用大驼峰(每个单词首字母大写)。

python

运行

class Student:
    pass

pass 表示空类,什么都不做。

然后根据这个类创建对象(实例化):

python

运行

# 创建对象 s1
s1 = Student()
# 创建对象 s2
s2 = Student()
print(s1)
print(s2)

你会发现 s1 和 s2 是两个不同的对象,互不干扰。


三、构造方法 __init__:给对象初始化数据

创建对象时自动执行的方法叫构造方法,固定名字:__init__(前后两个下划线)。

它的作用是:给对象设置初始属性

python

运行

class Student:
    # 构造方法
    def __init__(self, name, age, grade):
        # self 代表当前对象自己
        self.name = name    # 属性:姓名
        self.age = age      # 属性:年龄
        self.grade = grade  # 属性:年级

重点:self 是什么?

  • self 必须写在方法的第一个参数
  • 它代表当前这个对象自己
  • 每个对象调用方法时,self 自动传进去,不用你管

创建带属性的对象

python

运行

s1 = Student("张三", 16, "高一")
s2 = Student("李四", 15, "高一")
print(s1.name)   # 张三
print(s1.age)    # 16
print(s2.grade)  # 高一

每个对象都有独立的属性,互不影响。


四、在类里写方法(对象的行为)

方法就是类里面的函数,表示对象能做什么。

python

运行

class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    # 方法1:介绍自己
    def introduce(self):
        print(f"我叫{self.name},今年{self.age}岁")
    # 方法2:学习
    def study(self, subject):
        print(f"{self.name}正在学习{subject}")

使用:

python

运行

s = Student("小明", 14)
s.introduce()
s.study("数学")

输出:

plaintext

我叫小明,今年14岁
小明正在学习数学

这就是数据 + 行为打包成对象。


五、修改、访问、删除对象属性

1. 访问属性

python

运行

print(s.name)
print(s.age)

2. 修改属性

python

运行

s.age = 15
s.name = "大明"

3. 动态添加属性

Python 非常灵活,可以随时给对象加属性:

python

运行

s.score = 90
print(s.score)

4. 删除属性

python

运行

del s.score

5. 判断是否有属性

python

运行

print(hasattr(s, "name"))   # True
print(hasattr(s, "score"))  # False

六、三大特性之一:封装

封装 = 把数据保护起来,不让外部随便改

比如学生的分数不能随便改成 100,必须通过正规方法修改。

Python 用下划线约定表示私有:

  • _xxx:保护属性(约定不建议外部访问)
  • __xxx:私有属性(外部很难直接访问)

示例:

python

运行

class Student:
    def __init__(self, name):
        self.name = name
        self.__score = 0  # 私有属性
    # 提供方法设置分数
    def set_score(self, score):
        if 0 <= score <= 100:
            self.__score = score
        else:
            print("分数无效")
    def get_score(self):
        return self.__score

使用:

python

运行

s = Student("小红")
s.set_score(88)
print(s.get_score())   # 88
s.set_score(150)       # 分数无效

好处:

  • 外部不能随便乱改
  • 可以加验证逻辑
  • 代码更安全、更规范

七、三大特性之二:继承

继承 = 子类复用父类的功能,并扩展新功能。

比如:

  • 父类:人类(Person)
  • 属性:姓名、年龄
  • 方法:说话、吃饭
  • 子类:学生(Student)继承人类
  • 额外属性:学号
  • 额外方法:学习

语法:

python

运行

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def say(self):
        print(f"我是{self.name}")
# Student 继承 Person
class Student(Person):
    def __init__(self, name, age, student_id):
        # 调用父类构造方法
        super().__init__(name, age)
        self.student_id = student_id  # 子类自己的属性
    def study(self):
        print(f"{self.name}学习中")

使用:

python

运行

s = Student("小明", 15, "S1001")
s.say()     # 继承自父类
s.study()   # 子类自己的

继承的好处:

  • 代码不用重复写
  • 结构清晰
  • 方便扩展

八、三大特性之三:多态

多态就是:同一个方法名,不同子类可以有不同实现

示例:

python

运行

class Animal:
    def speak(self):
        pass
class Dog(Animal):
    def speak(self):
        print("汪汪汪")
class Cat(Animal):
    def speak(self):
        print("喵喵喵")

统一调用:

python

运行

def make_sound(animal):
    animal.speak()
dog = Dog()
cat = Cat()
make_sound(dog)   # 汪汪汪
make_sound(cat)   # 喵喵喵

这就是多态:同样调用 speak(),表现不同。


九、常用内置方法(魔术方法)

__xx__ 命名的方法叫魔术方法,系统自动调用。

1. __str__:打印对象时显示内容

python

运行

class Student:
    def __init__(self, name):
        self.name = name
    def __str__(self):
        return f"学生:{self.name}"
s = Student("小明")
print(s)   # 学生:小明

2. __len__:让对象可以用 len ()

python

运行

class Classroom:
    def __init__(self):
        self.students = []
    def add(self, s):
        self.students.append(s)
    def __len__(self):
        return len(self.students)
c = Classroom()
c.add("小明")
c.add("小红")
print(len(c))  # 2

3. __del__:对象销毁时调用

python

运行

def __del__(self):
    print("对象被销毁了")

十、类属性、实例属性、类方法、静态方法

1. 实例属性

每个对象自己的:self.name

2. 类属性

所有对象共享:

python

运行

class Student:
    school = "第一中学"   # 类属性
s1 = Student()
s2 = Student()
print(s1.school)   # 第一中学
print(s2.school)

3. 类方法 @classmethod

操作类属性:

python

运行

@classmethod
def set_school(cls, name):
    cls.school = name

4. 静态方法 @staticmethod

和对象无关,只是放在类里的工具函数:

python

运行

@staticmethod
def add(a, b):
    return a + b

十一、面向对象的优点总结

  1. 代码复用:继承避免重复
  2. 结构清晰:数据和行为打包
  3. 易于扩展:加功能不影响原有代码
  4. 安全可控:封装保护数据
  5. 符合现实逻辑:人、车、手机、学生都能直接映射成对象

十二、完整综合示例

python

运行

class Phone:
    def __init__(self, brand, color):
        self.brand = brand
        self.color = color
    def call(self, name):
        print(f"{self.color}的{self.brand}手机给{name}打电话")
class SmartPhone(Phone):
    def __init__(self, brand, color, system):
        super().__init__(brand, color)
        self.system = system
    def play_game(self):
        print(f"{self.brand}手机玩游戏,系统是{self.system}")
p = SmartPhone("iPhone", "白色", "iOS")
p.call("妈妈")
p.play_game()

输出:

plaintext

白色的iPhone手机给妈妈打电话
iPhone手机玩游戏,系统是iOS

十三、新手常见误区

  1. 忘记写 self
    方法第一个参数必须是 self,否则报错。
  2. 把类当对象直接用
    python

    运行



Student.name    # 错
s = Student()
s.name          # 对
  1. 以为继承会自动调用父类 init
    必须写 super().__init__(...)
  2. 随便修改私有属性
    虽然 Python 不强制禁止,但规范上不要直接改 __xxx

总结(极简版)

  • 类(Class):模板
  • 对象(Object):具体实例
  • 属性:变量,存储数据
  • 方法:函数,行为
  • 封装:保护数据,提供接口
  • 继承:代码复用
  • 多态:同一方法不同表现

学会这些,你已经掌握 Python 面向对象 90% 的常用内容,可以看懂绝大多数项目代码。

来源:http://www.dnuhf.cn

相关文章
|
25天前
|
运维 架构师 Java
架构设计的权衡:微服务、模块化与单体在Java生态中的选择
在Java架构设计中,微服务架构在过去十年间经历了从狂热追捧到理性回归的演变。2015年前后,“微服务”几乎成了先进架构的代名词——任何新项目如果不用微服务,似乎就落后于时代。
131 2
|
1月前
|
存储 缓存 安全
缓存是黑客最爱渗透和攻击的一环。为什么?优雅草卓伊凡
缓存虽提升性能,却成黑客攻击重灾区:缓存中毒、投毒、穿透、时间戳攻击及泄露等手段频发,易致数据泄露、页面篡改、服务瘫痪。因其配置常被忽视、应用广泛、防御薄弱,亟需强化策略配置、输入验证、缓存隔离与HTTPS加密防护。(239字)
144 10
|
存储 并行计算 Java
Python读取.nc文件的方法与技术详解
本文介绍了Python中读取.nc(NetCDF)文件的两种方法:使用netCDF4和xarray库。netCDF4库通过`Dataset`函数打开文件,`variables`属性获取变量,再通过字典键读取数据。xarray库利用`open_dataset`打开文件,直接通过变量名访问数据。文中还涉及性能优化,如分块读取、使用Dask进行并行计算以及仅加载所需变量。注意文件路径、变量命名和数据类型,读取后记得关闭文件(netCDF4需显式关闭)。随着科学数据的增长,掌握高效处理.nc文件的技能至关重要。
3297 0
|
1月前
|
人工智能 弹性计算 Ubuntu
OpenClaw+Ollama v0.18.1 联网搜索全攻略:阿里云+本地三系统部署+千问/Coding Plan配置及问题排查
2026年,本地AI智能体已进入实用化阶段,OpenClaw(原Clawdbot/Moltbot)凭借强大的插件生态与多渠道接入能力,成为主流开源AI助手框架。Ollama v0.18.1版本带来工具调用优化、云模型无缝直连、结构化输出等核心升级,搭配@ollama/openclaw-web-search官方联网插件,可让OpenClaw突破本地模型知识截止日期限制,实现实时联网检索、信息整理、数据追踪等能力。本文基于最新版本,完整覆盖Windows11/MacOS/Linux本地部署、阿里云ECS云端部署、Ollama v0.18.1对接、联网搜索插件配置、阿里云千问API与免费Coding
2022 19
|
1月前
|
Windows
Notepad++ 8.6 安装教程:详细步骤+自定义安装路径(附注意事项)
Notepad是Windows自带的轻量级纯文本编辑器;而Notepad++ 8.6是功能更强大的免费替代工具,支持语法高亮、多文档编辑等。本文详述其解压安装、路径设置、快捷方式创建等完整步骤,助您快速上手。(239字)
|
25天前
|
数据采集 消息中间件 监控
AIGC数据引擎的基石:图库抓取架构从单机到云原生的演进与实战
AIGC领域优化数据采集策略,提升大模型竞争力。初期使用Python脚本搭建单机爬虫,后转向分布式设计,引入代理技术。云原生部署实现弹性伸缩,全链路监控。构建高可用数据采集引擎是关键。
131 4
|
7月前
|
IDE 开发工具 开发者
Python类型注解:提升代码可读性与健壮性
Python类型注解:提升代码可读性与健壮性
383 102
|
10月前
|
JavaScript Java API
简单来说一说 @Value 注解
我是小假 期待与你的下一次相遇 ~
679 2
|
10月前
|
监控 大数据 API
Python 技术员实践指南:从项目落地到技术优化
本内容涵盖Python开发的实战项目、技术攻关与工程化实践,包括自动化脚本(日志分析系统)和Web后端(轻量化API服务)两大项目类型。通过使用正则表达式、Flask框架等技术,解决日志分析效率低与API服务性能优化等问题。同时深入探讨内存泄漏排查、CPU瓶颈优化,并提供团队协作规范与代码审查流程。延伸至AI、大数据及DevOps领域,如商品推荐系统、PySpark数据处理和Airflow任务编排,助力开发者全面提升从编码到架构的能力,积累高并发与大数据场景下的实战经验。
Python 技术员实践指南:从项目落地到技术优化
|
9月前
|
IDE 测试技术 API
python调试与测试
python调试与测试