2019/2/4 9.类 - Python 3.7.2文档
https://docs.python.org/3/tutorial/classes.html 1/13
9.类
类提供了将数据和功能捆绑在一起的方法。创建新类会创建 一种新
类
型
的对象,从而允许创建
该
类
型
的新
实
例
。每个类实例都可以附加属性以保持其状态。类实例还 可以具有用于修改其状
态的方法(由其类定义)。
与其他编程语言相比,Python的类机制添加了具有最少新语法和语义的类。它是C ++和
Modula-3中的类机制的混合体。Python类提供面向对象编程的所有标准功能:类继承机制允许
多个基类,派生类可 以覆盖其基类或类的任何方法,并且方法可以调用具有相同名称的基 类的
方法。对象可以包含任意数量和种类的数据。与模块一样,类也参与Python的动态特性:它们
是在运行时创建的,可以在创建后进一步修改。
在C ++术语中,通常类成员(包括数据成员)是
公共
的
(除了参见下面的私有变量),并且所
有成员函数都是
虚
拟
的
。与Modula-3一样,没有用于从 其方法引用对象成员的简 写:方法函数
使用表示对象的显式第一个参数声明,该参数由调用隐式提供。与Smalltalk一样,类本身也是
对象。这为导入和重命名提供了语义。与C ++和 Modula-3不同,内置类型可以用作用户扩展的
基类。此外,与 C ++一样,大多数具 有特殊语法(算术运 算符,下标等)的内 置运算符都可以
重新定义为类实例。
(由于缺乏普遍接受的术语来讨论类,我偶尔会使用 Smalltalk和C ++术语。我会使用Modula-3
术语,因为它的面向对象语义比Python更接近于C ++,但我希望读者很少听说过。)
9.1。一个关于名称和对象的词
对象具有个性,多个名称(在多个范围内)可以绑定到同一个对象。这在其他语言中称为别
名。乍一看Python时通常不会理解 这一 点,在处理不可变的基本类型(数字,字符 串,元组)
时可以安全地忽略它。但是,别名对包含可变对象(如列表,字典和大多数其他类型)的
Python代码的语义可能会产生惊人的影响。这通常 用于程序的好处,因为别名在某些方面表现
得像指针。例如,传递一个对象很便宜,因为实现只传递一个指针; 如果函数修改作为参数传递
的对象,调用者将看到更改 - 这消除了对Pascal中两个不同的参数传递机制的需要。
9.2。Python范围和命名空间
在介绍类之前,我首先要告诉你一些Python的范围规则。类定义对命名空间有一些巧妙的技
巧,你需要知道范围和命名空间如 何工 作才 能完 全理 解正 在发 生的 事情 。顺便说一下,关于这
个主题的知识对任何高级Python程序员都很有用。
让我们从一些定义开始。
一个
命名
空
间
是从名字到对象的映射。大多数名称空 间当前 都是作 为Python字 典实现 的,但 这
通常不会以任何方式显着(性能除外),并且可能在将来发生变化。命名空间的示例是:内置
名称集(包含诸如abs()和内置异常名称之类的函数); 模块中的全局名称; 和函数调用中的本
地名称。在某种意义 上,对象的属性集也形成命名空间。关于命名空间的重要一点 是,不同命
名空间中的名称之间绝对没有关系; 例如,两个不同的模块都可以定义函数maximize而不会 产生
混淆 - 模块的用户必须在其前面加上模块名称。