python系列学习四——定制数据对象

原创 2013年12月05日 14:21:10

1. 使用字典关联数据

    字典是python的一个内置数据结构,允许将数据与键而不是数字关联,这样可以使内存中的数据与实际数据的结构保持一致。字典在其他编程语言还有不同的名字,比如“映射”、“散列”、“关联数组”等。

1)创建空字典


2)给字典增加数据


与列表不同,python字典不会维持插入的顺序,字典重点维护的是关联关系,而不是顺序。


2. 使用类将代码与其数据打包

优点:使用类有利于降低复杂性;降低复杂性意味着bug更少;bug更少意味着代码更可维护;

1)定义类

在面向对象世界里,代码通常称为类的方法(method),而数据通常称为类的属性(attribute),实例化的数据对象则称为实例(instance)。

class Athlete:
    def __init__(self): # self为对象实例的目标标识符
        #The code to initialize a "Athelte" object
        ...
2) 创建对象实例
a = Athlete()
b = Athlete()
c = Athlete()
3)每个方法的第一个参数都是self

Python要求类中每个方法的第一个参数都是self:

class Athlete:
    def __init__(self, value=0):
        self.thing = value
    def how_big(self):
        return len(self.thing)

d = Athlete('Holy Grail')
print d.how_big()


小应用:
#!/usr/local/bin/python
#coding=utf-8

def sanitize(time_string):
    """Handling with data format of 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):
    """return a Athlete class of coach data"""
    try:
        with open(filename) as v_file:
            data = v_file.readline().strip().split(',')
        return Athlete(data.pop(0), data.pop(0), data)
    except IOError as err:
        print 'File error: ' + str(err)
        return None

class Athlete:
    def __init__(self, a_name, a_dob=None, a_times=[]):
        self.name = a_name
        self.dob = a_dob
        self.times = a_times
    def top3(self):
        return sorted(set([sanitize(item) for item in self.times]))[0:3]
    def add_time(self, a_time):
        self.times.append(a_time)
    def add_times(self, a_times):
        self.times.extend(a_times)

james = get_coach_data('james2.txt')
print james.name + "'s fastest times are: " + str(james.top3())

# for test
vera = Athlete('Vera Vi')
vera.add_time('1.31')
print vera.top3()
vera.add_times(['2.22', '1.21', '2.32'])
print vera.top3()

3. 类的继承

# 提供一个类名,新类将派生这个类
class NamedList(list): 
    def __init__(self, a_name):
        # 初始化所派生的类
        list.__init__([])
        self.name = a_name

可以看到,该类可以做到列表所做的所有事情,还可以在name属性中存储数据。

小实例:

#!/usr/local/bin/python
#coding=utf-8

def sanitize(time_string):
    """Handling with data format of 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):
    """return a Athlete class of coach data"""
    try:
        with open(filename) as v_file:
            data = v_file.readline().strip().split(',')
        return AthleteList(data.pop(0), data.pop(0), data)
    except IOError as err:
        print 'File error: ' + str(err)
        return None

class AthleteList(list):
    def __init__(self, a_name, a_dob=None, a_times=[]):
        list.__init__([])
        self.name = a_name
        self.dob = a_dob
        self.extend(a_times)
    def top3(self):
        return sorted(set([sanitize(item) for item in self]))[0:3]

james = get_coach_data('james2.txt')
print james.name + "'s fastest times are: " + str(james.top3())

# for test
vera = AthleteList('Vera Vi')
vera.append('1.31')
print vera.top3()
vera.extend(['2.22', '1.21', '2.32'])
print vera.top3()

小结:

1)使用dict()工厂函数或使用{}可以创建一个空字典

2)类似于列表和集合,Python的字典会随着新数据增加到这个数据结构中而动态变大

3)类方法与函数的定义基本相同,使用def关键字定义

4)类属性就像是对象实例中的变量

5)类中定义__init__()方法来初始化对象实例

6)类中定义的每个方法都必须提供self作为第一个参数

7)类中的每个属性前面都必须有self,从而将数据与其实例关联

8)类可以从零开始构建,也可以从Python的内置类或从其他定制类继承

python定制数据对象

james2.txt: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 1、使用字典关联...
  • jpp_aaa
  • jpp_aaa
  • 2017年11月10日 16:33
  • 79

python对象序列化

这篇文章主要介绍了Python中的序列化存储的方法,序列化存储主要针对的是内存和硬盘之间的写入操作,需要的朋友可以参考下 在程序运行的过程中,所有的变量都是在内存中,比如,定义一个dict: ...
  • kuaileboy1989
  • kuaileboy1989
  • 2015年08月21日 11:17
  • 1679

Python的对象传递与Copy函数

1.对象引用的传值或者传引用 Python中的对象赋值实际上是简单的对象引用。也就是说,当你创建一个对象,然后把它赋值给另一个变量的时候,Python并没有拷贝这个对象,而是拷贝了这个对象的引用。这种...
  • liu5257
  • liu5257
  • 2017年01月07日 04:53
  • 822

python中的类,对象,方法,属性等介绍

注:这篇文章写得很好。加底纹的是我自己的理解 python中一切皆为对象,所谓对象:我自己就是一个对象,我玩的电脑就是对象,坐着的椅子就是对象,家里养的小狗也是一个对象。。。。。。 ...
  • love1code
  • love1code
  • 2015年06月22日 14:47
  • 1559

python学习之对象的创建

python是一种面向对象的语言,其中python的内部包含了几种内建对象类型(数字,字符串,列表,元组和字典)。同时python也可以创建自己的对象和函数。在说明如何创建自己的对象之前,首先说明其中...
  • gaoxiang__
  • gaoxiang__
  • 2015年03月06日 16:54
  • 5270

Python填坑记——对象引用

首先,我们来了解一下python的基础概念: 1. Python在heap中分配的对象分成两类:可变对象和不可变对象。所谓可变对象是指,对象的内容是可变的,例如list。而不可变的对象则相反,表示其内...
  • ace_fei
  • ace_fei
  • 2013年11月26日 17:18
  • 4052

Python创建对象与赋值

Python是面向对象的语言,在Python在一切皆为对象。函数、属性都可以作为对象赋值给变量,并且规定参数的传递都是传递对象的引用(传地址)。所以说函数是可以通过赋值给变量的。入python的函数a...
  • q282048277
  • q282048277
  • 2017年05月25日 23:51
  • 329

python对象身份的比较

对象和类 对象=属性+方法 python是把所有的都当做一个对象,属性就是一个具体的值,而方法就是对于对象来说,可以通过什么方法来操作对象。 对象身份的比较 foo1=foo2=4.3 --->可...
  • xiaoqiu_cr
  • xiaoqiu_cr
  • 2017年08月02日 21:36
  • 239

python对象引用_一切都是对象

对象是在内存中实实在在的,在内存中有一个地址存放他的内容的。 引用可以理解成对这个对象的地址,或者这个对象的名字 python中有一句话是“python中一切都是对象”,整数在python中是一个整数...
  • qinyushuang
  • qinyushuang
  • 2017年05月08日 14:49
  • 889

Python对象赋值和拷贝

首先看赋值: >>> a = [1, 2, 3] >>> b = a >>> b.append(4) >>> print a, b [1, 2, 3, 4] [1, 2, 3, 4] 在Pytho...
  • login_sonata
  • login_sonata
  • 2016年10月04日 16:39
  • 316
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:python系列学习四——定制数据对象
举报原因:
原因补充:

(最多只允许输入30个字)