0

0

Python类怎么写_面向对象编程Class定义与实例化运行过程

P粉602998670

P粉602998670

发布时间:2026-03-16 12:33:31

|

622人浏览过

|

来源于php中文网

原创

Python类中__init__非必须,但传参初始化必须定义;self是约定参数,不可省略;类属性与实例属性易混淆,需注意赋值位置;方法须正确声明self、@staticmethod或@classmethod;子类需调用super().__init__()确保父类初始化。

python类怎么写_面向对象编程class定义与实例化运行过程

类定义时 __init__ 不是必须的,但没它就无法传参初始化

Python 类可以不写 __init__,这时候实例化 MyClass() 就只是生成一个空对象。但只要你想在创建对象时传入参数(比如 Person("Alice", 25)),就必须定义 __init__,且第一个参数得是 self

常见错误:把 __init__ 拼错成 __int____inint__,运行时不会报错,但参数全被忽略,实例属性一个都不会设上。

  • self 是对当前实例的引用,不是关键字,但约定俗成不能换;换成 methis 虽然语法通过,但会吓到协作者
  • 如果所有参数都有默认值,__init__ 可以完全省略参数传入,比如 def __init__(self, name=None, age=0):
  • 别在 __init__ 里做耗时操作(如读文件、连数据库),实例化就变慢,且异常难调试

实例属性和类属性混用,一改全改

在类体里直接写的变量(如 count = 0)是类属性,所有实例共享;在 __init__ 里用 self.xxx = ... 定义的是实例属性,各管各的。

常见错误:误把本该属于每个实例的字段写成类属性,比如 data = [],结果所有实例往里 append 都在操作同一个列表。

立即学习Python免费学习笔记(深入)”;

课游记AI
课游记AI

AI原生学习产品

下载
  • 判断依据:看赋值位置——类定义缩进内、函数外的是类属性;__init__ 或其他方法里带 self. 前缀的是实例属性
  • 类属性适合放常量、配置、计数器(如 created_count),但修改时要用 ClassName.attr = ...,而不是 self.attr = ...(后者会新建实例属性,遮蔽类属性)
  • 想让类属性可变又安全?用 @classmethod 包裹修改逻辑,避免直接裸写赋值

方法没加 self 参数,调用就报 TypeError: missing 1 required positional argument

普通实例方法必须把 self 当第一个参数,Python 在调用时自动传入当前实例。漏了它,解释器就会把实例当成第一个显式参数,导致“多传一个”。

错误现象:obj.do_something() 报错说缺参数,但你明明没写参数——其实是 self 没占位,Python 把 obj 塞进了第一个形参,后面没东西接了。

  • 静态方法用 @staticmethod,类方法用 @classmethod,它们不需要 self,但得明确标出来,否则一律按实例方法处理
  • IDE 通常能标出这种缺失,但命令行运行时才暴露,建议开 PyCharm 或 VS Code 的 Pylint 检查
  • 别靠删 self 来“修复”报错——那说明你根本没搞清这个方法该属于谁

继承中 super().__init__() 忘调或错调,父类初始化就失效

子类重写了 __init__,又没手动调父类的 __init__,那父类里定义的那些实例属性(比如 self.name)压根不会存在。

错误现象:子类实例访问 obj.parent_attrAttributeError,但父类明明写了初始化逻辑。

  • Python 3 中 super() 不带参数是安全的,推荐写成 super().__init__(...),比 ParentClass.__init__(self, ...) 更健壮(尤其多重继承)
  • 如果父类 __init__ 有必填参数,子类必须传过去;漏传或类型不对,错误发生在父类内部,堆栈可能让你找不到源头
  • 不是所有父类都要求调 __init__——比如只定义了类属性、没实例属性的父类,但别猜,看父类源码或文档
类的运行过程其实就三步:加载类定义 → 执行 __new__ 分配内存 → 执行 __init__ 填充数据。大多数人卡在第二步之后,因为 __new__ 很少动,而 __init__ 写错、漏调、参数错位,都会让对象“看起来建出来了,其实没建好”。

相关文章

编程速学教程(入门课程)
编程速学教程(入门课程)

编程怎么学习?编程怎么入门?编程在哪学?编程怎么学才快?不用担心,这里为大家提供了编程速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1570

2023.10.24

counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

203

2023.11.20

go语言 面向对象
go语言 面向对象

本专题整合了go语言面向对象相关内容,阅读专题下面的文章了解更多详细内容。

58

2025.09.05

java面向对象
java面向对象

本专题整合了java面向对象相关内容,阅读专题下面的文章了解更多详细内容。

65

2025.11.27

go语言 面向对象
go语言 面向对象

本专题整合了go语言面向对象相关内容,阅读专题下面的文章了解更多详细内容。

58

2025.09.05

java面向对象
java面向对象

本专题整合了java面向对象相关内容,阅读专题下面的文章了解更多详细内容。

65

2025.11.27

go语言 面向对象
go语言 面向对象

本专题整合了go语言面向对象相关内容,阅读专题下面的文章了解更多详细内容。

58

2025.09.05

java面向对象
java面向对象

本专题整合了java面向对象相关内容,阅读专题下面的文章了解更多详细内容。

65

2025.11.27

C++多线程并发控制与线程安全设计实践
C++多线程并发控制与线程安全设计实践

本专题围绕 C++ 在高性能系统开发中的并发控制技术展开,系统讲解多线程编程模型与线程安全设计方法。内容包括互斥锁、读写锁、条件变量、原子操作以及线程池实现机制,同时结合实际案例分析并发竞争、死锁避免与性能优化策略。通过实践讲解,帮助开发者掌握构建稳定高效并发系统的关键技术。

2

2026.03.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 5万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号