菜鸟教程 -- 学的不仅是技术,更是梦想!

Python 面向对象中的 __init__ 方法怎么理解?

原文: Python super() 函数

sme000 参考文章

直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)。一开始看到这句话,不太理解。

看了这个文章后,明白了。

我们在学习 Python 类的时候,总会碰见书上的类中有 __init__() 这样一个函数,很多同学百思不得其解,其实它就是 Python 的构造方法。

构造方法类似于类似 init() 这种初始化方法,来初始化新创建对象的状态,在一个对象呗创建以后会立即调用,比如像实例化一个类:

f = FooBar()
f.init()

使用构造方法就能让它简化成如下形式:

f = FooBar()

你可能还没理解到底什么是构造方法,什么是初始化,下面我们再来举个例子:

class FooBar:
 def __init__(self):
 self.somevar = 42
>>>f = FooBar()
>>>f.somevar

我们会发现在初始化 FooBar 中的 somevar 的值为 42 之后,实例化直接就能够调用 somevar 的值;如果说你没有用构造方法初始化值得话,就不能够调用,明白了吗?

在明白了构造方法之后,我们来点进阶的问题,那就是构造方法中的初始值无法继承的问题。

例子:

class Bird:
 def __init__(self):
 self.hungry = True
 def eat(self):
 if self.hungry:
 print 'Ahahahah'
 else:
 print 'No thanks!'
class SongBird(Bird):
 def __init__(self):
 self.sound = 'Squawk'
 def sing(self):
 print self.song()
sb = SongBird()
sb.sing() # 能正常输出
sb.eat() # 报错,因为 songgird 中没有 hungry 特性

那解决这个问题的办法有两种:

1、调用未绑定的超类构造方法(多用于旧版 python 阵营)

class SongBird(Bird):
 def __init__(self):
 Bird.__init__(self)
 self.sound = 'Squawk'
 def sing(self):
 print self.song()

原理:在调用了一个实例的方法时,该方法的self参数会自动绑定到实例上(称为绑定方法);如果直接调用类的方法(比如Bird.__init__),那么就没有实例会被绑定,可以自由提供需要的self参数(未绑定方法)。

2、使用super函数(只在新式类中有用)

class SongBird(Bird):
 def __init__(self):
 super(SongBird,self).__init__()
 self.sound = 'Squawk'
 def sing(self):
 print self.song()

原理:它会查找所有的超类,以及超类的超类,直到找到所需的特性为止。

ADO 教程 AI Agent 教程 AI 入门教程 Ajax 教程 Android 教程 Angular2 教程 AngularJS 教程 AppML 教程 ASP 教程 ASP.NET 教程 Bootstrap 教程 Bootstrap4 教程 Bootstrap5 教程 C 教程 C# 教程 C++ 教程 Chart.js 教程 Claude Code 教程 CMake 教程 Codex 教程 CSS 参考手册 CSS 教程 CSS3 教程 Cursor 教程 Dart 教程 Dash 教程 Django 教程 Docker 教程 DTD 教程 ECharts 教程 Eclipse 教程 Electron 教程 FastAPI 教程 Firebug 教程 Flask 教程 Flutter 教程 Font Awesome 图标 Foundation 教程 Git 教程 Go 语言教程 Google 地图 API 教程 Hermes Agent Highcharts 教程 HTML DOM 教程 HTML 参考手册 HTML 字符集 HTML 教程 HTTP 教程 ionic 教程 iOS 教程 Java 教程 JavaScript 参考手册 Javascript 教程 jQuery EasyUI 教程 jQuery Mobile 教程 jQuery UI 教程 jQuery 教程 JSON 教程 JSP 教程 Julia 教程 Jupyter Notebook 教程 Kotlin 教程 LangChain 教程 LaTeX 教程 Linux 教程 Lua 教程 Markdown 教程 Matplotlib 教程 Maven 教程 Memcached 教程 MongoDB 教程 MySQL 教程 Next.js 教程 NLP 教程 Node.js 教程 NumPy 教程 Obsidian 教程 Ollama 教程 OpenCode 教程 OpenCV 教程 Pandas 教程 Perl 教程 PHP 教程 Pillow 教程 Playwright 教程 PostgreSQL 教程 PowerShell Pycharm 教程 Python 3 教程 Python 基础教程 Python 设计模式 Python 量化交易 PyTorch 教程 R 教程 RDF 教程 React 教程 Redis 教程 RESTful API RSS 教程 Ruby 教程 Rust 教程 Sass 教程 Scala 教程 SciPy 教程 Selenium 教程 Servlet 教程 Skills 教程 Sklearn 教程 SOAP 教程 SQL 教程 SQLite 教程 SVG 教程 SVN 教程 Swagger 教程 Swift 教程 Tailwind CSS 教程 TCP/IP 教程 TensorFlow 教程 TypeScript 教程 uni-app 教程 VBScript 教程 Vibe Coding 教程 VSCode 教程 Vue.js 教程 Vue3 教程 W3C 教程 Web Service 教程 WSDL 教程 XLink 教程 XML DOM 教程 XML Schema 教程 XML 教程 XPath 教程 XQuery 教程 XSLFO 教程 XSLT 教程 Zig 教程 数据结构 机器学习 正则表达式 汇编语言 测验 浏览器 网站品质 网站建设指南 网站服务器教程 网络协议 设计模式

AltStyle によって変換されたページ (->オリジナル) /