首页 > 代码库 > 第 9 章 类
第 9 章 类
面向对象编程是最有效的软件编写方法之一。在面向对象编程中,我们编写表示现实世界中的事物和情景的类,并基于这些类来创建对象。编写类时,我
们定义一大类对象都有的通用行为。基于类创建对象时,每个对象都自动具备这种通用行为,然后可根据需要赋予每个对象独特的个性。使用面向对象编程可模拟
现实情景,其逼真程度达到了令人惊讶的地步。
根据类来创建对象被称为实例化,这让我们能够使用类的实例。在本章中,我们将编写一些类并创建其实例。我们将指定可在实例中存储什么信息,定义可对这些实例执行哪些操作。我们还将编写一些类来扩展自己的程序文件中导入其他程序员编写的类。
理解面向对象编程有助于我们像程序员那样看世界,还可以帮助我们真正明白自己编写的代码:不仅是各行代码的作用,还有代码背后更宏大的概念。了解类
背后的概念可培养逻辑思维,让我们能够通过编写程序来解决遇到的几乎任何问题。
随着面临的挑战日益严峻,类还能让我们以及与我们合作的其他程序员的生活更轻松。如果我们与其他程序员基于同样的逻辑来编写代码,我们就能明白对方所做的工作;我们编写的程序将能被众多合作者所理解,每个人都能事半功倍。
9.1 创建和使用类
使用类几乎可以模拟任何东西。下面来编写一个表示小狗的简单类Dog——它表示的不是特定的小狗,而是任何小狗。对于大多数宠物狗,我们都知道些什么呢?它们都有自己的名字和年龄;我们还知道,大多数小狗还会蹲下和打滚。由于大多数小狗都具备上述两项信息(名字和年龄)和两种行为(蹲下和打滚),我们的Dog类将包含它们。这个类让Python知道如何创建表示小狗的对象,编写这个类后,我们将使用它来创建表示特定小狗的实例。
类就是把一类具有共同属性的事物封装到一起,不用重复编写这些程序,编写好类后,需要的时候只需调用相应的类即可。
9.1.1 创建Dog类
根据Dog类创建的每个实例都将存储名字和年龄。我们赋予了每条小狗蹲下(sit())和打滚(roll_over())的能力:
class Dog():
"""一次模拟小狗的简单尝试"""
def __init__(self,name,age):
"""初始化属性name和age"""
self.name = name
self.age = age
def sit(self):
‘‘‘模拟小狗被命令时蹲下‘‘‘
print(self.name.title() + ‘ is now sitting.‘)
def roll_over(self):
‘‘‘模拟小狗被命令时打滚‘‘‘
print(self.name.title() + " rolled over!")
这里需要注意的地方很多,但我们也不用担心,本章充斥着这样的结构,我们有大把的机会熟悉它。在(1)处,我们定义了一个名为Dog的类。根据约定,
在Python中,首字母大写的名称指的是类。这个类定义中的括号是空的,因为我们要从空白创建这个类。在(2)处,我们编写了一个文档字符串,对这个
类的功能做了描述。
1、方法__init__()
类中的函数称为方法;我们前面学到的有关函数的一切都适用于方法,就目前而言,唯一重要的差别是调用方法的方式。(3)处的方法__init__()是一个
特殊的方法,每当我们根据Dog类创建新实例时,Python都会自动运行它。在这个方法的名称中,开头和末尾各有两个下划线,这是一种约定,旨在避免
Python默认方法与普通方法发生名称冲突。
我们将方法__init__()定义成了包含三个形参:self、name和age。在这个方法的定义中,形参self必不可少,还必须位于其他形参前面。为何必须
包含形参self呢?因为Python调用这个__init__()方法来创建Dog实例时,将自动传入实参self,它是一个指向实例本身的引用,让实例能够访问类中的属性
和方法。我们创建Dog实例时,Python将调用Dog类的方法__init__()。我们将通过实参向Dog()传递名字和年龄,self会自动传递,因此我们不需要传递它。
每当我们根据Dog类创建实例时,都只需给最后两个形参(name和age)提供值。
第 9 章 类