设为首页 收藏本站
查看: 649|回复: 0

[经验分享] Python第九课-使用 类(class)创造新的数据类型!

[复制链接]

尚未签到

发表于 2017-5-5 08:35:07 | 显示全部楼层 |阅读模式
前言
之前几课里边我们接触到了很多内置数据类型,字符串、列表、字典等等。
难道一个编程语言里只能使用定义好的数据类型吗?如果他们并不非常适合现有数据的表达呢?我们可以创造一个新的数据类型来使用吗?
当然可以,面向对象思想中的类(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']


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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-373201-1-1.html 上篇帖子: Python 编码时应该注意的几件事情 下篇帖子: paste deploy python ini 配置文件简单说明
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表