python中类的使用_Python第九课-使用 类(class)创造新的数据类型!

前言

之前几课里边我们接触到了很多内置数据类型,字符串、列表、字典等等。

难道一个编程语言里只能使用定义好的数据类型吗?如果他们并不非常适合现有数据的表达呢?我们可以创造一个新的数据类型来使用吗?

当然可以,面向对象思想中的类(class)概念可以帮助我们完成这个任务!

上节课中get_data函数取出的数据类型为字典(dictionary),james2.txt内数据的表达方式为:

james_data = {'dob': '2002-3-14', 'name': 'James Lee', 'times': ['2.34', '3.21', '2.34', '2.45', '3.01', '2.01', '2.01', '3.10', '2.22', '2.01', '2.01', '2.16']}

这样已经够好了,可是我们可以在数据的表达方式上做的更好!

一、关于类(class)的基础练习

目标:创建一个定制的类Athlete

介绍:用Athlete实现与字典基本相似的结构和方法,如包含了name,dob,times属性,对times属性进行添加、删除等操作的方法。

1、首先定义数据格式化函数sanitize 照搬上课即可

2、定义Athlete类:

class Athlete:

'''此类包含三个属性name,dob,times

两个方法add_time(向times属性中增加一个元素);add_times方法(向times属性中增加一组元素)'''

def __init__(self, a_name, a_dob=None, a_times=[]): #python中没有构造函数,此函数意为初始化函数

self.name = a_name

self.dob = a_dob

self.times = a_times

def add_time(self, value): #对类添加一些方法,类中的方法用函数形式定义

self.times.append(value)

def add_times(self, values): #self参数是类中方法的必须参数,必须放在第一个参数位置。可以把self参数理解为 本类的一个实例(类本身),参照java中的this理解

self.times.extend(values)

3、修改上课中获取数据的get_data方法

def get_data(filename):

'''此函数作用是将文件行内的字符串数据以','分片,并用sanitize函数格式化后存储为Athlete类型返回

参数filename是待处理的文本文件'''

try:

with open(filename) as f:

data = f.readline()

ldata = data.strip().split(',')

a_name = ldata.pop(0)

a_dob = ldata.pop(0)

clean_times = [sanitize(each_time) for each_time in ldata]

return(Athlete(a_name, a_dob, clean_times)) #这里将Athlete实例化,返回Athlete的一个实例

except IOError as ioerr:

print('file missing: ' + str(ioerr))

4、调用get_data方法看结果

james_data = get_data('james2.txt') #james_data——Athlete的一个实例

print(james_data.name, james_data.dob, james_data.times) #james_data.name——调用类属性

james_data.add_times(['4.52', '3.71']) #调用类方法

print(james_data.times)

结果:

James Lee 2002-3-14 ['2.34', '3.21', '2.34', '2.45', '3.01', '2.01', '2.01', '3.10', '2.22', '2.01', '2.01', '2.16']

['2.34', '3.21', '2.34', '2.45', '3.01', '2.01', '2.01', '3.10', '2.22', '2.01', '2.01', '2.16', '4.52', '3.71']

二、类的深入探索:继承

我们将把Athlete类改造成为一个继承自list的类(list本身也是一个类)

这样Athlete就可以使用列表的所有特性!减少开发量,减少脑细胞死亡量!

至于待处理数据中的 名字、生日 怎么办呢?别忘了Athlete是个定制的类,我们可以给它两个属性来分别表达 名字、生日

目标:修改现有Athlete类

介绍:

让Athlete本身是一个列表,用来表达运动员的成绩,这样就可以利用列表的现有方法操作Athlete,省去了定义方法的麻烦。

另外给Athlete类增加两个属性,name属性和dob属性,用来表达运动员的名字和生日。

1、修改Athlete类:

class Athlete(list):

'''此类是一个列表类,继承与内置类列表

此类有两个属性name,dob'''

def __init__(self, a_name, a_dob=None, a_times=[]):

self.name = a_name

self.dob = a_dob

self.extend(a_times)

2、sanitize和get_data函数不更改,执行下看看结果:

james_data = get_data('james2.txt')

print(james_data.name, james_data.dob, james_data) #james_data是Athlete的一个实例,本身就是一个列表

james_data.append('4.32') #Athlete继承自list,所以list得方法Athlete都可以用

print(james_data)

结果:

James Lee 2002-3-14 ['2.34', '3.21', '2.34', '2.45', '3.01', '2.01', '2.01', '3.10', '2.22', '2.01', '2.01', '2.16']

['2.34', '3.21', '2.34', '2.45', '3.01', '2.01', '2.01', '3.10', '2.22', '2.01', '2.01', '2.16', '4.32']

类的知识点还有好多,之后再叙!

0

0

分享到:

sina.jpg

tec.jpg

2012-09-19 16:51

浏览 2648

评论

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值