【Python实战13】使用面向对象的思想来处理数据

和很多编程语言一样,python允许创建并定义面向对象的类,在python中也是使用class来定义一个类的。


使用class定义类:

【Python实战13】使用面向对象的思想来处理数据


创建对象实例:

【Python实战13】使用面向对象的思想来处理数据


注意在定义python类中的方法时,每一个方法的第一个参数都是self,代表对象自己。


下面我们一起来看看类的具体定义和操作吧:


1、首先创建一个Atylete类

>>> class Atylete:
	def __init__(self,a_name,a_birthday=None,a_time=[]):
		self.name=a_name
		self.birthday=a_birthday
		self.time=a_time
2、定义完类之后,我们创建两个对象,并初始化数据

>>> sarah=Atylete(‘sarah‘,‘2002-02-16‘,[‘2:58‘,‘2:36‘,‘2:56‘])
>>> james=Atylete(‘james‘)
>>> 
>>> type(sarah)
<class ‘__main__.Atylete‘>
>>> type(james)
<class ‘__main__.Atylete‘>
3、尽管sarah和james都是通过Atylete创建,不过这两个对象存放在不同的地址中
>>> sarah
<__main__.Atylete object at 0x0000000002EF2978>
>>> james
<__main__.Atylete object at 0x0000000002F03198>
4、可以通过对象调用自己的属性
>>> sarah.name
‘sarah‘
>>> sarah.time
[‘2:58‘, ‘2:36‘, ‘2:56‘]
>>> 
>>> james.name
‘james‘

好了,知道了类的概念后,我们修改上一篇文章中最后的代码,加入类的概念,修改后的代码如下:
"定义Atylete类"
class Atylete:
    def __init__(self,a_name,a_birthday=None,a_time=[]):
        self.name=a_name
        self.birthday=a_birthday
        self.time=a_time
    def top3(self):
        return(sorted(set([sanitize(t) for t in self.time]))[0:3])


"""转换时间格式"""
def sanitize(time_string):
    if ‘-‘ in time_string:
        splitter=‘-‘
    elif ‘:‘ in time_string:
        splitter=‘:‘
    else:
        return(time_string)
    (mins,secs)=time_string.split(splitter)
    return(mins+‘.‘+secs)

"""读取文件内容,并按逗号进行拆分"""
def get_coach_data(filename):
    try:
        with open(filename) as file:
            data = file.readline()
            temp=data.strip().split(‘,‘)
            return(Atylete(temp.pop(0),temp.pop(0),temp))
    except IOError as error:
        print(‘File Error:‘+str(error))
        return(None)

"""读取文件的内容"""
james = get_coach_data(‘james.txt‘)
julie = get_coach_data(‘julie.txt‘)
mikey = get_coach_data(‘mikey.txt‘)
sarah = get_coach_data(‘sarah.txt‘)



"""打印姓名、生日和最快的三个时间"""
print(james.name+"的生日是:"+james.birthday+",最快的三个时间是:"+str(james.top3()))
print(julie.name+"的生日是:"+julie.birthday+",最快的三个时间是:"+str(julie.top3()))
print(mikey.name+"的生日是:"+mikey.birthday+",最快的三个时间是:"+str(mikey.top3()))
print(sarah.name+"的生日是:"+sarah.birthday+",最快的三个时间是:"+str(sarah.top3()))
这里我们新定义一个类,用来保存数据并在类中定义了一个top3函数,用来返回最快的三个时间,同时也修改了get_coach_data函数,让其返回Atylete对象,运行结果如下:

>>> ================================ RESTART ================================
>>> 
James Lee的生日是:2002-3-14,最快的三个时间是:[‘2.01‘, ‘2.16‘, ‘2.22‘]
Julie Jones的生日是:2002-8-17,最快的三个时间是:[‘2.11‘, ‘2.23‘, ‘2.59‘]
Mikey McManus的生日是:2002-2-24,最快的三个时间是:[‘2.22‘, ‘2.31‘, ‘2.38‘]
Sarah Sweeney的生日是:2002-6-17,最快的三个时间是:[‘2.18‘, ‘2.21‘, ‘2.22‘]

我们再向Atylete类中增加两个方法,如下:

"定义Atylete类"
class Atylete:
    def __init__(self,a_name,a_birthday=None,a_time=[]):
        self.name=a_name
        self.birthday=a_birthday
        self.time=a_time
    def top3(self):
        return(sorted(set([sanitize(t) for t in self.time]))[0:3])
    def add_time(self,time_value):
        self.time.append(time_value)
    def add_times(self,list_of_time):
        self.time.extend(list_of_time)

运行以上的代码,重新定义一个对象:
>>> wangwu=Atylete(‘wangwu‘)
>>> wangwu.add_time(‘2:03‘)
>>> print(wangwu.top3())
[‘2.03‘]
>>> wangwu.add_times([‘2:10‘,‘2:85‘,‘3:10‘])
>>> print(wangwu.top3())
[‘2.03‘, ‘2.10‘, ‘2.85‘]
可以看到,通过类我们可以很方面的对数据进行操作。

【Python实战13】使用面向对象的思想来处理数据,布布扣,bubuko.com

【Python实战13】使用面向对象的思想来处理数据

上一篇:python使用锁访问共享变量


下一篇:浅谈C++的io操作