上集回顾:
- 打开文件
- 写文件
- 读文件
- 文件流位置
日常生活中许多人会把东西分类整理,同一类东西会有一些相同的特性和使用方法。
程序中也存在这样的分类方法,把具有相同属性和方法的放到一个类型当中,就称为一个类。
一、类的定义
最简单的类定义形式如下:
class ClassName:
<语句-1>
.
.
.
<语句-N>
与函数定义 (def
语句) 一样,类定义必须先执行才能生效。在实践中,类定义内的语句通常都是函数定义,但也可以是其他语句。类里的函数定义一般是特殊的参数列表,这是由方法调用的约定规范所指明的。
例如定义一个圆,会有属性x坐标、y坐标和半径,还有求圆面积的方法,这个类可以这么定义:
import math
class Circle:
''' 默认圆心为坐标原点,默认半径为1 '''
px = 0
py = 0
r = 1
def __init__(self, r = 1, px = 0, py = 0) :
self.r = r
self.px = px
self.py = py
def area(self) :
return math.pi * self.r * self.r
print(Circle.px)
print(Circle.py)
print(Circle.r)
c = Circle()
print(c.area())
保存为test.py,在命令行执行结果为:
$ python test.py
0
0
1
3.141592653589793
二、实例对象
一旦类定义完成以后,就可以随时创建一个属于这个类的具体实例,这个过程就叫做创建实例对象(宅男就再也不会缺少对象了)。例如上面的c = Circle()
就是创建了一个叫c的示例对象,c的圆心是坐标原点,半径是1。同样还可以创建c2 = Circle(2, 1, 1)
,这时就创建了c2对象,c2的半径是2, 圆心坐标是(1, 1)。
再定义一个Dog类,狗的种类用kind,狗的名字叫name:
>>> class Dog:
... kind = "泰迪"
...
... def __init__(self, name) :
... self.name = name
...
>>> d1 = Dog("阿黄")
>>> d2 = Dog("大黄")
>>> d1.kind
'泰迪'
>>> d2.kind
'泰迪'
>>> d1.name
'阿黄'
>>> d2.name
'大黄'
可以直接修改对象的kind属性,不会影响类的属性。
>>> d2.kind = "金毛"
>>> d2.kind
'金毛'
>>> d2.name
'大黄'
>>> d1.kind
'泰迪'
>>> d1.name
'阿黄'
>>> d3 = Dog("小贝")
>>> d3.kind
'泰迪'
>>> d3.name
'小贝'
可以看到修改了d2的kind只会影响到d2,d1的kind不会改变,后面新创建的对象kind也不受影响。
三、继承
既然是分类,就会有大类小类,每个大类又能细分成不能的小类,一般小类会有大类的所有特性,而又会有一些自己特有的属性,这就是继承。例如狗是一个小类,大类可以是有毛的动物。很容易知道所有的狗都是有毛的动物,但是有毛的动物并不一定都是狗,也可能是猫。继承的格式如下:
class DerivedClassName(BaseClassName):
<语句-1>
.
.
.
<语句-N>
改写一下Dog类:
>>> class FurAnimal:
... discription = "很多毛"
...
>>> class Dog(FurAnimal):
... kind = "泰迪"
...
... def __init__(self, name):
... self.name = name
...
>>> Dog.discription
'很多毛'
>>> d1 = Dog("大黄")
>>> d1.name
'大黄'
>>> d1.kind
'泰迪'
>>> d1.discription
'很多毛'
可以发现,Dog类只是改动了一点点,就直接拥有了父类的属性,还可以继承到方法,这就是类和继承的魅力。
本集总结:
- 类的定义
- 实例对象
- 继承
下集见
网友评论