news 2026/7/7 4:47:23

## Python 类和对象:别背语法,先理解“模板“和“实例“的关系

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
## Python 类和对象:别背语法,先理解“模板“和“实例“的关系

Python 类和对象:别背语法,先理解"模板"和"实例"的关系

面向对象编程,听起来很唬人,其实核心就两个概念:对象

类就是模板,对象就是根据模板造出来的具体东西。打个比方:类是一张"员工入职登记表"的模板,对象就是你拿着这个模板给每个新员工填出来的那张具体表格。

Python 里万物皆对象,但你自己也能定义类。

定义一个类:从空壳子开始

class关键字定义一个类,类名用帕斯卡命名法(首字母大写):

classPerson:pass# pass 表示啥都不干,占个位置# 造一个对象出来p=Person()print(p)# <__main__.Person object at 0x...>

目前这个Person是个空壳子,啥用没有。我们需要给它加东西。

构造方法__init__:对象出生时该干的事

__init__是 Python 的构造方法,对象被创建的时候自动调用。它的作用就是给对象初始化——设置初始状态、存一些基础数据。

classPerson:def__init__(self,name,age):self.name=name# 把参数存到对象身上self.age=agedefintroduce(self):print(f"我叫{self.name},今年{self.age}岁")# 创建对象的时候传入参数p=Person("Alice",20)p.introduce()# 我叫 Alice,今年 20 岁

关键点:

  • self就是对象本身,相当于 Java 里的this
  • self.name是对象的属性,每个对象有自己的独立副本
  • __init__可以有默认参数,让某些属性可选
classStudent:def__init__(self,name,major="计算机科学"):self.name=name self.major=major s1=Student("Bob")# major 用默认值s2=Student("Charlie","数学")# major 自己指定

类变量 vs 实例变量:共享的和独享的

这是刚学 Python 类的时候最容易搞混的地方。

实例变量:每个对象各有一份,互不影响。用self.xxx定义。

类变量:所有对象共享一份,属于类本身。直接在类下面定义,不在任何方法里面。

classEmployee:# 类变量:统计员工总数,所有对象共享emp_count=0def__init__(self,name):self.name=name# 实例变量:每个员工的名字各不同Employee.emp_count+=1e1=Employee("张三")e2=Employee("李四")print(e1.name)# 张三print(e2.name)# 李四print(Employee.emp_count)# 2,所有对象共享

什么时候用类变量?统计总数、全局配置、默认值等所有对象共用的东西。

什么时候用实例变量?每个对象各自不同的数据,比如名字、年龄、分数。

三种方法:实例方法、类方法、静态方法

1. 实例方法:最常用的,第一个参数是self
classPerson:def__init__(self,name):self.name=namedefsay_hello(self):# self 是当前对象print(f"Hello, I'm{self.name}")

实例方法能访问实例变量和类变量,是日常写代码最常用的一种。

2. 类方法:用@classmethod,第一个参数是cls(类本身)
classPerson:count=0def__init__(self,name):self.name=name Person.count+=1@classmethoddefget_count(cls):returncls.count# 返回总人数

类方法通常用来操作类变量,或者作为工厂方法——用不同方式创建对象。

classPerson:def__init__(self,name,age):self.name=name self.age=age@classmethoddeffrom_birth_year(cls,name,birth_year):# 用出生年份推算年龄,创建对象age=2026-birth_yearreturncls(name,age)p=Person.from_birth_year("Alice",2000)# 不用传 age,自动算
3. 静态方法:用@staticmethod,不需要 self 或 cls

静态方法跟类本身没有直接关系,只是因为逻辑上属于这个类,所以放在里面。它不访问任何实例或类属性。

classMathUtils:@staticmethoddefis_even(num):returnnum%2==0# 直接用类名调用,不需要创建对象MathUtils.is_even(10)# True

继承:子类继承父类的东西

单继承:一个子类只有一个父类
classAnimal:def__init__(self,name):self.name=namedefeat(self):print(f"{self.name}在吃东西")# Dog 继承 AnimalclassDog(Animal):defbark(self):print(f"{self.name}在汪汪叫")dog=Dog("旺财")dog.eat()# 继承来的dog.bark()# 自己的
重写父类方法:子类把父类的方法覆盖掉
classCat(Animal):defeat(self):# 重写父类的 eatprint(f"{self.name}爱吃鱼")cat=Cat("咪咪")cat.eat()# 咪咪 爱吃鱼(自己的方法)
调用父类的方法:用super()
classBird(Animal):def__init__(self,name,can_fly):super().__init__(name)# 先调父类的 __init__,初始化 nameself.can_fly=can_fly# 再初始化子类自己的属性defeat(self):super().eat()# 先执行父类的 eatprint(f"{self.name}还爱吃虫子")

super()的作用是"调用父类的同名方法",避免硬编码父类名,代码更好维护。

多继承:一个子类有多个父类
classFlyable:deffly(self):print("会飞")classSwimmable:defswim(self):print("会游泳")classDuck(Flyable,Swimmable):passduck=Duck()duck.fly()# 会飞duck.swim()# 会游泳

多继承的问题在于:如果多个父类有同名方法,Python 按什么顺序找?答案是MRO(方法解析顺序),从左到右。Duck(Flyable, Swimmable)先找 Flyable,再找 Swimmable。

私有属性:名字前面加两个下划线

Python 没有真正的私有,但用双下划线开头可以"隐藏"属性:

classPerson:def__init__(self,name,age):self.name=name# 公开的self.__age=age# 私有的defget_age(self):returnself.__age p=Person("Alice",20)print(p.name)# Alice,可以访问# print(p.__age) # 报错,访问不了print(p.get_age())# 20,通过方法访问

其实 Python 只是把__age改名叫_Person__age了,你非要访问也能p._Person__age,但强烈不推荐。私有属性的意义是"约定"而不是"强制"——告诉使用这个类的人:别碰这个属性。

几个特殊方法:让对象更像对象

方法作用什么时候触发
__init__初始化对象创建对象时
__str__对象的字符串表示print(obj)str(obj)
__repr__对象的官方字符串表示调试时,或在交互式环境直接输入对象名
__len__对象的长度len(obj)

__str__最常用:

classBook:def__init__(self,title,author):self.title=title self.author=authordef__str__(self):returnf"《{self.title}》(作者:{self.author})"book=Book("Python 编程","张三")print(book)# 《Python 编程》(作者:张三)

不定义__str__的话,print(book)会打印一串看不懂的内存地址。

类比java的toString方法

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/7 4:46:36

从零开始在 CentOS 7 上部署 Docker:我的实战踩坑记录

写在前面 这是我 Docker 学习之路的第二篇文章。前一篇《从虚拟机到容器&#xff1a;Docker 解决了什么问题》讲了概念&#xff0c;这篇来点硬核的——真实环境下的部署实战。 从网络配置到镜像拉取&#xff0c;从 Dockerfile 编写到 Docker Compose 编排&#xff0c;我把这几…

作者头像 李华
网站建设 2026/7/7 4:44:53

终极GTA5安全防护菜单:YimMenu完全使用指南

终极GTA5安全防护菜单&#xff1a;YimMenu完全使用指南 【免费下载链接】YimMenu YimMenu, a GTA V menu protecting against a wide ranges of the public crashes and improving the overall experience. 项目地址: https://gitcode.com/GitHub_Trending/yi/YimMenu Y…

作者头像 李华
网站建设 2026/7/7 4:43:46

网站优化提速!KKCE在线Ping优选IPv6 CDN边缘节点

双栈网站接入CDN后&#xff0c;IPv6节点调度不均常导致部分用户加载卡顿&#xff0c;盲目调整权重无数据支撑。KKCE全域在线Ping&#xff0c;量化各CDN边缘节点IPv6链路质量&#xff0c;指导精准调度优化。平台从全国三网及海外节点&#xff0c;对网站IPv6 CDN地址发起高频在线…

作者头像 李华
网站建设 2026/7/7 4:43:26

构建自定义加密库:从算法封装到密钥管理的工程实践

1. 项目概述&#xff1a;为什么我们需要一个自定义加密库&#xff1f;在当今的软件开发中&#xff0c;数据安全早已不是“可选项”&#xff0c;而是“必选项”。无论是用户密码、支付信息&#xff0c;还是核心业务数据&#xff0c;加密都是保护它们的第一道防线。然而&#xff…

作者头像 李华
网站建设 2026/7/7 4:41:46

常德本地环保装修哪家技术强

在常德&#xff0c;装修是许多家庭都会面临的大事&#xff0c;而环保装修更是成为了大家关注的焦点。毕竟&#xff0c;谁都希望自己的家不仅美观舒适&#xff0c;更要健康环保&#xff0c;能让家人住得安心。然而&#xff0c;市场上装修公司众多&#xff0c;让人眼花缭乱&#…

作者头像 李华
网站建设 2026/7/7 4:40:50

python-LangGraph框架(3-31-LangGraph 「合并式状态管理」的原理与实践)

合并式状态&#xff08;Annotated 自定义合并函数&#xff09; 完美解决了这一核心问题。本文将聚焦 LangGraph 模式 3&#xff1a;并行结果安全合并&#xff0c;深度拆解合并式状态的设计理念、核心机制与落地实现&#xff0c;带你掌握多并行任务的安全状态管理方案。一、场景…

作者头像 李华