Python中的类和对象

Python自存在以来一直是一种面向对象的语言。 因此,创建和使用类和对象非常简单。在面向对象出现之前,面向过程是一种流行的编程思想,它的重点在函数上。而面向对象编程强调的是对象。

对象只是数据(变量)和作用于这些数据的方法(函数)的集合。 同样,类是该对象的模板。

我们可以将类视为房屋的设计图。 它包含有关地板、门、窗等的所有细节。我们根据这些描述建造出了一座房屋。 这座房屋就是一个对象。

可以根据房屋的设计图建造许多房屋,类似地我们可以创建一个类的许多个对象。 对象也称为类的实例,创建此对象的过程称为实例化。

定义类 就像定义函数时以def关键字开头一样,定义类以class关键字开头。

类中的第一个字符串称为docstring,其中包含对该类的简要说明。可以用于生成文档,虽然它不是强制性的,但强烈建议这样做。

class Student: '''学生类'''

def __init__(self, name, age):
    """初始化属性name和age。"""
   self.name = name
    self.age = age

def doHomework(self): """做作业""" print(f"{self.name}开始做作业了。")

def goToSchool(self):
    """上学"""
    print(f"{self.name}出发去上学!")

Python中有这样的约定:类使用首字母大写的单词或词组表示。函数使用首字母大写的单词或词组表示。

构造函数init()方法 类中的函数称为方法。你在前面学到的有关函数的一切都适用于方法。

init()是一个特殊方法,每当创建Student类的实例的时候,Python都会自动运行它。在这个方法的名称中,开头和末尾各有两个下划线,这是一个必须的约定。务必确保init()的两边都有两个下划线,否则当你使用类来创建实例时,将不会自动调用这个方法。

我们将方法init()定义成包含三个形参:self、name和age。在这个方法的定义中,形参self必不可少,而且必须位于其他形参的前面。为何必须在方法定义中包含形参self呢?因为Python调用这个方法来创建Dog实例时,将自动传入实参self。每个与实例相关联的方法调用都自动传递实参self,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。

属性 方法init()定义的两个变量都有前缀self。以self为前缀的变量可供类中的所有方法使用,可以通过类的任何实例来访问。self.name = name将形参name的值赋给类的变量name,该变量与当前创建的实例相关联,可以任何实例中通过self.name访问该变量name。self.age = age的作用与此类似。像这样可通过实例访问的变量称为属性。

方法 Student类还定义了两个方法doHomework和goToSchool。它们只有一个形参self。我们随后将演示使用创建的实例访问这些方法。目前,doHomework和goToSchool所做的事情很有限,只是打印一条消息,指出学生正在做作业或去上学的路上。但可以扩展这些方法以实现更多的细节。

创建类的实例(对象) 类可以被视为实例(对象)的模板,实例就是按照此模板生成的特定的个体。此过程也实称为实例化类。下面演示了创建学生实例的方法:

student = Student('小明', 9)

print(f"这个学生的姓名是:{student.name}。") print(f"这个学生有{student.age}岁了。") 这这里使用的是前一个示例中编写的Student类。首先创建了一位名字为'小明'、年龄为9岁的小狗。执行这行代码时,Python使用实参'小明'和9调用Student类的方法init()。方法init()创建一个表示特定学生的实例,并使用提供的值来设置属性name和age。接下来,返回一个表示这位学生的实例,然后将这个实例赋给了变量student。在这里,命名约定很重要:通常可认为首字母大写的名称(如Student)指的是类,而小写的名称(如student)指的是根据类创建的实例。

访问属性 要访问实例的属性,通常使用句点表示法。上例中使用代码student.name来访问student的属性name的值,就是使用了句点表示法。

在Student类中引用这个属性时,使用的是self.name,如我们在类的定义中有过类似的用法。

调用方法 调用类的方法,也使用句点表示法。如下示例所示,创建了Student类的实例后,就可以调用类定义的任何方法了。

student = Student('小明', 9)

student.doHomework() student.goToSchool() 将输出如下内容:

小明开始做作业了。 小明出发去上学! 属性的默认值 创建实例时,有些属性无须通过形参来定义,可在方法init()中为其指定默认值。如上的Student类的示例,如果我们还需要存储他所在的学校,并且它们都来自同一学校(后期可以转到其它学校),这时就可以添加一个schoolName属性,并为它设置默认值。

class Student: '''学生类'''

def __init__(self, name, age):
    """初始化属性name和age。"""
   self.name = name
   self.age = age
   self.schoolName="第一小学"

def doHomework(self): """做作业""" print(f"{self.name}开始做作业了。")

def goToSchool(self):
    """上学"""
    print(f"{self.name}出发去上学!")