第 27 章 类编码基础 类编码基础
本作品已使用人工智能进行翻译。欢迎您提供反馈和意见:translation-feedback@oreilly.com
既然我们已经抽象地讨论了OOP,现在是时候看看如何将其转化为实际代码了。本章开始介绍 Python 类模型背后的语法细节。
如果你过去从未接触过 OOP,那么一味地学习类可能会显得有些复杂。为了让类的编码更容易理解,我们将在本章中通过初步了解一些基本类的操作来开始我们对 OOP 的详细探索。在本书这一部分的后面章节中,我们将扩展这里介绍的细节,但就其基本形式而言,Python 类很容易理解。
事实上,类只有三个主要区别。与模块不同的是,类还支持生成多个对象、命名空间继承和操作符重载。让我们依次探索这三种区别,开始我们的class 语句之旅。
类生成多个实例对象
要理解 多个对象的想法是如何工作的,首先要理解在 Python 的 OOP 模型中有两种对象:类对象和实例对象。类对象提供默认行为,是实例对象的工厂。实例对象是您的程序所处理的真正对象--每个实例对象本身都是一个命名空间,但它继承(即自动访问)了创建它的类中的名称。类对象来自语句,实例来自调用;每次调用一个类,就会得到一个新的实例。
这种对象生成的概念与我们在本书中看到的大多数其他程序构造非常不同。实际上,类本质上是生成多个实例的工厂。相比之下,每个模块只有一个副本被导入到一个程序中。事实上,这也是reload 能够在原处更新单实例共享对象的原因。有了类,每个实例都可以拥有自己的独立数据,支持该类所模拟对象的多个版本。
在这种作用下,类实例类似于第 17 章中 闭包(又称工厂)函数的每次调用状态,但这是类模型的自然组成部分,而且类中的状态是显式属性,而不是隐式作用域引用。此外,这只是类的一部分功能--类还支持通过继承、操作符重载和方法的多种行为进行自定义。一般来说,类是一种更完整的编程工具,尽管 OOP和函数编程并不是相互排斥的范式。我们可以通过在方法中使用函数工具、编写本身就是生成器的方法、编写用户定义的迭代器(我们将在第 30 章中看到)等方式将它们结合起来。
下面从 Python OOP 的两种对象类型方面快速总结了 Python OOP 的基本要素。正如您所看到的,Python 类在某些方面与defs 和模块都很相似,但它们可能与您在其它语言中使用的有很大不同。
类对象提供默认行为
当我们运行class 语句时,我们会得到一个类对象。下面是 Python 类的主要属性:
语句
class语句创建一个类对象,并为其赋名。就像函数def语句一样,Pythonclass语句也是一条可执行语句。当到达并运行时,它会生成一个新的类对象,并将其赋值给class头文件中的名称。此外,与def一样,class语句通常在首次导入它们所编码的文件时运行。语句内的赋值
class语句内的赋值生成类属性。就像在模块文件中一样,在class语句(不嵌套在def中)中的顶层赋值会在类对象中生成属性。从技术上讲,class语句定义了一个局部作用域,该作用域变形为类对象的属性命名空间,就像模块的全局作用域一样。运行class语句后,类属性可通过名称限定来访问:object.name.类属性提供对象的状态和行为。类对象的属性记录了由该类创建的所有实例共享的状态信息和行为;嵌套在
class内的函数def语句生成处理实例的方法。
实例对象是具体项目
当我们调用类对象时,会得到一个实例对象。下面概述了类实例背后的要点:
调用类对象就像调用函数一样,会产生一个新的实例对象。每次调用类 ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access