Hello, 各位小伙伴们,108到现在还学的开心吗?
听说你们已经精通了loop,list,dictionary的运用,也通过了midterm
的磨练觉得自己已经是Master in 108了!
过来人的一句话图样图森破Too Young Too Simple
(以下内容涉及深度剧透,请做好准备后进行观看)
作为108后半学期的重点你们即将接触到
Class的设计
这是在108中最为核心也是在148中会重点讲解的一个topic!
划
重
点
/1/ 什么是 Class ?
A:108已经接触到了许多的data type,有int, str, list,dict, 每一个都有许多的method可供使用,如果只是通过这些data type来进行储存单一数据这并不会是一个难题。
但是如果通过已经学过的知识来表示一个学生来储存他的姓名,学生号,年纪,性别, GPA这种时候要怎么办?在108现阶段有以下三种方法。
[1] 写一个超级长的str来储存每一个学生相对应的数据
[2] 写一个list来储存数据
[3] 写一个dict来储存数据
技术角度来说都是没有问题的,但是随着需要储存的数据的增多,data也会相应的变长, 做一些operation的难度也会变大。
/2/ 可不可以使储存上面这些data变的简单呢?
A:那么到底可不可以专门定义一个学生的存在来使储存上面这些data变的简单呢?
既然诚心诚意的发问了,那么为了防止世界被破坏, 为了守护世界的和平(以下省略)答案是可以的!而定义学生这个存在也是学习Class的敲门砖。
说到Class,就必须要做一次对Python这门语言的分析。 Python是一个Object-Oriented Programming Language(面向对象语言),对象这个概念渗透在了Python这个语言里, Python解决问题的核心原理一直是以一个object(对象)作为中心, 通过调用这个对象所支持的method来进行操作从而解决问题( 划重点!)。
/3/ 那么对象和Class到底有什么关联?
A:Class被称之为类,它定义了一种存在或者一种概念。比方说所有人都是人类,类是一个较为抽象的定义,而对象则是把类这个定义具体化后的一个存在。比如说一个教授A,教授A他是一个把人类这个概念具体化后的存在,也就是一个对象。
举一个栗子,学生这个概念是可以被定义为一个类的,而这就是一个Class,是一种由User自己定义的data type。所有108中学到的data type 例如int, str, dict它们每一个都是一个单独的Class,所以创建Class也被认作为定义一个data type。
Python的语法定义Class是通过使用关键字class
class Student
这就是开始一个class的第一步。
使用Class的一个原因是通过把所需要的细小的data合并在一起,成为一个更高等级的存在,学生这个例子中,规定了每一个学生需要的data有姓名,学生号,年纪,性别, GPA,而每一个学生所必要的data都被称之为Attribute(属性)将这些需要的属性存储在一个class中,就是在class的学习中的第二步。
存储data这个过程也就是初始化一个对象,通过给予每一个属性一个确切的值来不断丰富一个空白的对象,使其拥有多种属性,这就是初始化一个对象的核心。例如学生这个“类”, 我们可以让这个学生拥有他的名字,成绩,学生号等等, 这就能让我们的这个“学生”获取多种的属性。
初始化的这个步骤是通过在class内使用method来实现的。很多人搞不清function和method的差别,但其实两者并没有什么不同,所有在class内定义的function皆被称之为method。而初始化对象这个method有着特殊的命名,叫做 __init__(initialize的缩写)。
写到Python里的话就会是这样的一个例子:
这样 Student Class的__init__ method 就被写好了。对于self这个参数的存在,这是一开始困扰了许多人的一个难点。
/4/ self到底是什么?
A:打开天窗说亮话self就是每一个Class所对应的一个对象。在 “Student” 这个Class里self指向的就是一个student对象。
Python的语法规定所有method的第一个参数都需要是self。而self的作用至关重要,它的作用是定义了一个类所对应的对象(不是一个空白的类),在__init__中,self是一个空白的student,是一个什么都没有的自闭患者,通过使用“.”给这个空白的student添加一个属性,然后通过使用“=”(assign符)给予每个属性一个确切的数据。
self.student_names所代表的含义就是赋予一个空白的学生一个叫做student_name的属性,然后self.student name=name是将name这个data给与到student_name这个属性上,这样一个学生就拥有了student_name这个属性且student_name它所对应的value就是name这个data。
在结束__init__这个method后,一个学生将会拥有五种属性且每一个属性都会有一个确切的value。在我们的栗子中,student将会有 student_name他的名字,student_num他的学生号,grade他的年级,gender他的性别,gpa他的gpa。
大家在108学到的知识是function要被使用才有意义,那么怎样才能call上面所写的__init__这个method来创建一个学生的对象呢。创建对象的语法和定义一个variable的语法十分接近,要做的事有三步,第一步就是起一个变量名给它,第二步把每一个属性的value传进去,第三步扔给电脑去实现它。具体的语法是变量名 = 类名(所有data的value)。
student_a = Student(“YourFather”, “10000000001”, “first year”, “male”, 4.0)
这样实现一个学生对象就完成了,通过__init__这个method,一个名为student_a的学生被初始化了且它拥有着它所需要的五种属性和对应的value。
那么如果想要去access每一个属性要怎么做?语法是对象名.属性名。例如student_a.student_name,这样就可以access student_a的student_name这个属性了,到此class的最基础使用也就搞定了,但是费了这么久的时间创造出的class的好处在哪里呢,现在开始重点突出这一点。
这个属性了,到此class的最基础使用也就搞定了.但是费了这么久的时间创造出的class的好处在哪里呢?
/5/ 创造Class的好处在哪里?
上面提到过Python解决问题的核心是以对象为中心使用对象所支持的method来进行操作的,如果换一个角度来想,如果能够丰富一个对象所支持的method,那么这个对象所能做的事情就会变的多样了。
用大家都喜欢的gpa举一个例子,上面通过__init__确保了每一个学生都会有着自己的GPA, 但是如果对确切的GPA不感冒(毕竟不是所有人都是4.0学神,比起说3.7的GPA是不是说自己是A会更有范一点呢),那么创建一个将gpa转换为letter_grade的method,就可以让学生这个对象能支持的操作就多了一个。
再复习一下上面提到过每一个method的第一个参数都必须是self,self代表着一个对象,在__init__中,一个对象被初始化且对象所需要的属性被赋予了切确的value。从而之后的每一个method中self都不再是一个什么都没有的孤儿,它拥有着确切的属性和对应的value,这样就支持了它去实现一定的method,在to_letter_grade的method中,就通过access self的gpa这个属性和使用if进行了从gpa到letter grade的转化。如此一个student可以支持的method就又多了一个,各位小伙伴可以通过想象力来去继续编写来使student可以支持更多的method。
到此,关于class的基本操作就已经被向大家剧透的差不多了,也希望能给各位一个关于class的预习同时可以对大家在108后半的学习中有一个帮助。
科普结束
文字:Dino
排版:没有笔名的小可爱
校对:Julia
无论线上线下,无论白天黑夜,你总能感受到来自ADA的温暖守候。
领取专属 10元无门槛券
私享最新 技术干货