《Python语言程序设计》学习笔记
笔记选自《Python语言程序设计》[美]梁勇 著
本篇笔记没有记录用python绘画的turtle库
第7章 对象和类
-
插播一条英语小知识:图形用户界面(GUI,读作goo-ee)。
-
定义类:
class Circle:
def __init__(self, radius=1):
self.radius=radius # 数据域radius在初始化程序中被创建
- 构造对象
完成两个任务:
(1)在内存中为类创建一个对象;
(2)调用类的__init__
方法来初始化对象。
包括初始化程序的所有方法,都有第一个参数self
。这个参数指向调用方法的对象。__init__
方法中的self
参数被自动地设置为引用刚被创建的对象。
- 创建对象:c1是一个变量,它包含一个指向Circle对象的引用
c1=Circle(5) # 创建radius=5的Circle对象
c2=Circle() # 创建radius为默认值1的Circle对象
- 访问对象成员:使用圆点运算符(
.
)访问对象的数据域并调用它的方法,也称为对象成员访问运算符。
objectRefVar.datafield
objectRefVar.method(args)
- 通常,你创建一个对象并将它赋给一个变量。随后,你可以使用变量指代这个对象。偶尔,对象也不需要随后被引用。在这种情况下,你可以创建一个对象而不需要明确将它赋值给变量,如下所示:
print("Area is", Circle.getArea())
这个语句创建Circle对象并调用它的getArea方法来返回它的面积。以这种方式创建的对象被称为匿名对象。
- self参数:
self是指向对象本身的参数,可以使用self访问在类定义中的对象成员。
一个实例变量被创建,作用域就是整个类:self.x self.y
在不同方法中被创建后的作用域是整个类。
注意:你也可以在方法中创建局部变量。局部变量的作用域是在该方法内。局部变量z
在方法m1中被创建,而它的作用域就是从它创建时起到方法m1结束。
def ClassName:
def __init__(self, ...)
self.x = 1 # 作用域是整个类
def m1(self, ...)
self.y = 2 # 作用域是整个类
z = 5 # 作用域是这个方法m1
def m2(self, ...)
self.y = 3 # 更改m1方法中创建的y的值
u=self.x + 1 # 使用init方法中创建的x的值
self.m1(...) # 调用函数m1
-
注意:看似保存一个对象的变量实际上包含的是指向这个对象的引用。严格地讲,变量和对象是不同的,但大多数情况下,两者的区别是可以忽略的。所以,为了简单起见,最好说“
circle1
是一个Circle
对象”,而不会冗长地描述为“circle1
是一个变量,它包含一个指向Circle
对象的引用”。 -
不变对象和可变对象:当将一个可变对象传给函数时,函数可能会改变这个对象的内容。
当你将一个对象传递给函数,就是将这个对象的引用传递给函数。但是,传递不可变对象和可变对象之间还有更重要的区别。- 像数字或字符串这样的不可变对象参数,函数外的对象的原始值并没有被改变。
- 像圆这样的可变对象参数,如果对象的内容在函数内被改变,则对象的原始值被改变。
-
隐藏数据域:私有数据与是以两个下划线开始来定义的;也可以使用两个下划线开始来定义私有方法。
为了让客户端能访问数据域,就要定义get、set方法
一个get
方法有下面的方法头:
def getPropertyName(self):
如果返回类型是布尔型,那么习惯上get
方法被如下定义:
def isPropertyName(self):
一个set
方法有下面的方法头:
def setPropertyName(self, propertyValue):
import math
class Circle:
def __init__(self, radius=1):
self.__radius=radius
def getRadius(self):
return self.__radius
def getPerimeter(self):
return 2*self.__radius*math*pi
本章总结
- 类是一种对象的模板、蓝图、合约和数据类型。它定义了对象的属性,并提供用于初始化对象的初始化程序和操作这些属性的方法。
- 初始化程序总是以
__init__
命名。每个方法的第一个参数包括类中的初始化程序,它指向调用这个方法的对象。按照惯例,这个参数以self
命名。 - 对象是类的一个实例。你使用构造方法来创建一个对象,使用圆点运算符(
.
)通过引用变量来访问对象的成员。 - 实例变量或方法属于类的一个实例。它的使用和每个独立的实例相关联。
- 类中的数据域应该被隐藏以避免被更改并使类易于维护。
- 你可以提供
get
方法或set
方法使客户端可以查看或更改数据。通俗地讲,get
方法被称为获取器(或访问器),而set方法被称为设置器(或修改器)。
关键术语
英文 | 中文 |
---|---|
abstract data type(ADT) | 抽象数据类型 |
accessor(getter) | 访问器(获取器) |
action | 动作 |
class | 类 |
class abstraction | 类抽象 |
class encapsulation | 类封装 |
class’s contract | 类的合约 |
client | 客户端 |
constructor | 构造方法 |
data fields | 数据域 |
data hiding | 数据隐藏 |
dot operator(.) | 圆点运算符(.) |
identity | 实体 |
initializer | 实例 |
instance | 实例方法 |
anonymous object | 匿名对象 |
attributes | 属性 |
behavior | 行为 |
instance variable | 实例变量 |
instantiation | 实例化 |
mutator(setter) | 修改器(设置器) |
object-oriented programming(OOP) | 面向对象程序设计(OOP) |
private data fields | 私有数据域 |
private method | 私有方法 |
property | 属性 |
state | 状态 |
Unified Modeling Language(UML) | 统一建模语言(UML) |