-
类的概述(Class Introduce)
- “小明,去买点水果回来做沙拉吧。”,妈妈对小明说。小明也没有再问,就随便买了些苹果,梨子,桔子之类的水果回来。在这里,水果,就是一个类别。它们有共同的属性,如质量,颜色,价格等。在生活中,很多事物都可以归为一个类别。我们也学过很多数据类型,它们有的是整数,有的是字符串,有的是列表。用type命令就能显示出它们的类别出来。现在让我们复习一下所学过的类别吧。在IDLE里输入type和数据,看看它们是什么类别,下面是示例代码:
-
>>> x = 5 >>> type(x) # 显示x的类别 <class 'int'> >>> string = "Python" >>> type(string) # 显示string的类别 <class 'str'> >>> f = 32.768 >>> type(f) # 显示f的类别 <class 'float'> >>> type([]) # 显示[ ]的类别 <class 'list'> >>> type(True) # 显示True的类别 <class 'bool'> >>> >>> from turtle import Turtle # 从海龟模块导入Turtle类 >>> t = Turtle() >>> type(t) # 显示t的类别 <class 'turtle.Turtle'>
上面的14行以上的都是Python内置的类型,而第16行则是Python自带的海龟模块里面的一个类型,它叫Turtle类。通过Turtle类,我们可以新建一个海龟对象,所新建的海龟都有共同的属性和命令。那么问题来了,这个Turtle类是怎么“制作”出来的? 当然,它是由一个程序员编写的,以供我们学习编程。要学习编写一个Turtle类超出了我们的学习范围。我们现在学习如何编写一个非常简单的类。
-
定义类(Define Class)
- 我们学习过定义函数,用的是def 关键词。如果要定义一个类,则用的是class关键词。最简单的类是这样的:class Test:pass。这就定义了一个类,它的名字是Test,它的内容是pass,也就是没有内容,但它可是真正能使用的类。用Turtle类生成一只小海龟也叫做实例化一只小海龟,这只小海龟就是生成的一个对象。 刚才我们定义了一个叫Test的类,那么也能用它生成一个对象,用Test()这个命令就行了,当然我们一般给它取个名字,也可以把这个名字叫做t,以下是示例代码:
-
>>> class Test: # 定义类Test pass # 忽略内容 >>> t = Test() # 实例化Test >>> type(t) # 查看t的类别 <class '__main__.Test'> >>>
上面我们用Test类实例化了一个对象,这个对象的名字叫t。用type命令能查看到它的类别。上面的类太简单了,我们可以在类中定义一个叫初始化的函数,当实例化对象的时候,这个函数会马上运行,它会对这个对象进行初始化,这个函数的名字一定要是__init__。下面我们来定义它。
-
>>> class Test: # 定义名叫Test的类 def __init__(self): # 定义初始化方法 print("我诞生了。") >>> t = Test() # 实例化Test类 我诞生了。 >>>
上面我们定义了初始化函数。需要说明的是,在类中所定义的函数叫方法,它的第一个参数用来表示实例化后的自己,一般用的名称是self(自己)。当实例化的时候,__init__方法就对自己进行初始化。 当然,既然它是函数,也就会有返回值,不过一般初始化方法不用返回数据。函数可不止一个参数,也可能有几个,接下来,我们新建一个叫Point的类,并且给它的初始化方法加了两个参数。以下是代码示例:
-
>>> class Point: # 定义名叫Point的类 def __init__(self,x,y): # 定义初始化方法 self.x = x # 设定属性x,赋值为x self.y = y # 设定属性y,赋值为y >>> p = Point(10,10) # 实例化一个点,x值是10,y值也是10 >>> print(p.x) # 打印p.x的值 10 >>> print(p.y) # 打印p.y的值 10 >>> p.z = 20 # 新增一个属性叫z,并赋值 >>> print(p.z) 20 >>>
point在英文中是点的意思,在这里我们用它来代表一个平面坐标点。所有的坐标点都有共同的属性,如x坐标,y坐标。我们定义的Point类就是用来代表坐标点的,注意它的第一个字母为大写,这是一种约定俗成的写法。 Point类的初始化方法里有三个参数,self代表实例化后的自己,x用来代表x坐标的初始值,y用来代表y坐标的初始值。这是我们的一种设定,这三个参数分别用a,b,c理论上也是没有任何问题的。
第三句代码是self.x = x,我们用它来表示这个点初始化后的x坐标的值是x。self.y = y设定了这个坐标点的y值。 下面是p点实例化时的赋值图:
- 上面在初始化方法中用点号给对象增加了两个变量,它们叫做属性。如果要修改它们的值的话,直接用点号操作符,让它等于某个值就可以了。我们在类之外也可以直接给对象增加属性,如可以写p.z = 20,这样p点又增加了一个属性了。综上所述,定义类的语法是首先用关键词class,然后加空格,接着写上类的名字,这个名字的第一个字母应该用大写,最后就是冒号。通常情况下,我们会定义__init__方法。以下是类的定义示例图:
- 定义类,和定义函数相似之处在于,这都是我们的一种设计。类就相当于对象的蓝图或模版,它就像一座工厂,不过它能实例化很多对象。现在我们编写程序,或许先要考虑一下,在程序中会出现什么对象,然后这些对象会有什么共同的性质或行为,然后思考如何把它们定义成一个类。
-
练习
- 下列代码在IDLE中是什么操作?有什么问题吗?
-
>>> class fruit pass
说说下列IDLE中每行代码的意思。
-
>>> class Python: def __init__(self,length): self.length = length print("我的长度是:",self.length) >>> snake = Python(100) 我的长度是: 100 >>> snake.length = 200 >>> snake.weight = 300 >>>
- 阅读下列代码,说出每行代码的意思,它的运行结果是什么,代码有什么问题?
-
>>> import random >>> class random: def __init__(self,x): self.x = x * 2 >>> r = random(10) >>> print(r.x) >>> random.randint(10,20)
李兴球
李兴球的博客是Python创意编程原创博客