首页 > 开发 > Python > 正文

Python中的类和对象

2023-04-24 19:21:33
字体:
来源:转载
供稿:网友

这篇文章将介绍Python中类和对象的定义和使用方法。

类和对象基础知识

在面向对象世界里,我们在描述事物时一般从静态特征和动态特征两个方面进行描述。比如描述一个人,年龄、发色、脸型、身高等这些属于静态特征,而说话、跑步、走路等,这些属于动态特征。

在实际中,我们到底需要描述事物的那些特征,这跟我们要研究的问题领域有关,比如同样一个人,他作为学生时,我们可能关注他的学号、姓名、年龄、班级、专业、学习年限等静态特征,可能关注他的选课、考试、参加体育活动等动态特征;如果他作为一个职工,可能我们要关注他的职工号、姓名、年龄、工作年数、职级、入职时间等静态特征,可能关注他的晋职、加薪、辞职、退休等动态特征。

在面向对象里,我们把事物的静态特征称为属性,而把动态特征称为行为。

我们把具有相同属性和行为的事物定义为一个类

对象属于类的一个实例,也就是说对象是类的一个具体的内容。如定义了一个学生类,则一个具体的学生张三就是学生的一个实例。

类是产生对象的一个模板,使用类定义的对象具有相同的属性和行为,只不过属性的取值可能不同,行为产生的最终结果可能不同。

在具体的编程语言中,有时属性也称之为类的变量,而行为称之为类的方法或类的函数。

在具体的编程语言中,一个类可能既有属性又有方法,也可能只有属性,也可能只有方法。

Python中的类和对象

Python中类的定义方法

在Python中使用关键字class来定义一个类,其基本语法格式如下:

class className:
    # 类的属性或方法

上面className表示类的名称,类的名称一般是个名词,在Python中类的名称后紧跟一个冒号,然后在下面定义它的属性或方法。

类定义的一个例子

下面我们来定义个学生类。

class Student:
    student_id = '00000'
    student_name = '无名氏'

    def haveLesson(self):
        print(f'{self.student_id}的姓名是:{self.student_name}')
        print(f'{self.student_name}正在上课。')

上面这个例子定义了一个学生类,在里面定义了两个变量,student_id和student_name并给出了默认值。由于Python中的变量无需事先定义直接可以使用,则如果定义的话必须给出一个值来。

haveLesson属于类中定义的一个方法(函数),它跟定义普通方法的方式没有什么区别,不过类中的每个方法都有一个参数self,它表示调用当前方法的类的对象实例。haveLesson()方法中用于输出两行信息。

在使用这个类定义对象时,所有对象在其两个属性上的取值都相同的。

定义类的实例(对象)

下面这个例子在上面例子的基础上来定义实例并演示具体使用方法。

s1 = Student()
s1.haveLesson()

s1.student_id = '10011'
s1.student_name = '武林网'
s1.haveLesson()

上面这个例子演示了创建类对象的方法,Python跟其他面向对象语言不同,在定义实例(对象)时,直接使用s1 = Student()即可,无需使用new。

上面这个例子也演示了对象使用其属性和方法的形式。

其输出结果如下:

00000的姓名是:无名氏
无名氏正在上课。
10011的姓名是:武林网
武林网正在上课。

Python中定义类的构造器

类的构造器又称类的构造函数或构造方法。Python中定义构造函数的方式与其它面向对象语言也不相同,它使用__init__()实现。

比如上面学生类的例子,使用它定义的每个对象都具有相同的student_id和student_name取值,如何在定义实例时获得不同的取值呢?这就需要借助类的构造器了。

下面这个例子对上面的例子进行了改写。

class Student:
    def __init__(self, sid, sname):
        self.student_id = sid
        self.student_name = sname

    def haveLesson(self):
        print(f'{self.student_id}的姓名是:{self.student_name}')
        print(f'{self.student_name}正在上课。')

s1 = Student('10011', '武林网')
s1.haveLesson()

s2 = Student('10012', '优雅的代码')
s2.haveLesson()

其运行结果如下:

10011的姓名是:武林网
武林网正在上课。
10012的姓名是:优雅的代码
优雅的代码正在上课。

Python与其它面向对象编程语言不同的是,它不支持类构造函数的重载,即Python不支持在类中定义多个构造函数。最后一个定义的构造函数将会覆盖掉前面定义的构造函数,同时Python不给出任何提示。如下面的例子:

class Student:
    def __init__(self, sid):
        self.student_id = sid

    def __init__(self, sid, sname):
        self.student_id = sid
        self.student_name = sname

    def haveLesson(self):
        print(f'{self.student_name}({self.student_id})在上课.')

s1 = Student('10011')
s1.haveLesson()

其运行结果如下:

Traceback (most recent call last):
  File "D:/Py/classInPython.py", line 12, in <module>
    s1 = Student('10011')
TypeError: Student.__init__() missing 1 required positional argument: 'sname'

从结果可以看出,因为最后定义的构造函数是带2个参数的,因此在定义实例时使用1个参数将会给出TypeError错误。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表