首页 > 代码库 > python高级编程之(类级):子类内建类型

python高级编程之(类级):子类内建类型

# -*- coding: utf-8 -*-

# python:2.x

__author__ = ‘Administrator‘

#类级

#在2.2中,提出了类型(type0与类(class)统一(请访问:https://www.python.org/download/releases/2.2.3/descintro(可能已经不存在了))-这使内建类型的子类化成为可能,并且添加一个新内建类型object

#用于所有内建类的公共祖先

#展示一个名为distinctdict类的代码,与平常的dict一样,但它不允许存在多个相同键值,,发出现相同项时,出现ValueError异常

class DistinctError(Exception):

    pass

class distinctdict(dict):

    def __setitem__(self, key, value):

        try:

            value_index=self.values().index(value)

            #只要dict在2次调用之间没有发生改变

            #keys()和values()将返回相应的列表

            #否则,dict类型无法保证序列的顺序

            existing_key=self.keys()[value_index]

            if existing_key!=key:

                raise  DistinctError((‘this value already exists for %s:‘%(str(self[existing_key]))))

        except ValueError as s :

            pass

        super(distinctdict,self).__setitem__(key,value)

my=distinctdict()

my[‘key‘]=‘value‘

#my[‘other_key‘]=‘value‘__main__.DistinctError: this value already exists for value:

my[‘other_key‘]=‘value2‘

print my#{‘other_key‘: ‘value2‘, ‘key‘: ‘value‘}

#看看刚刚的代码,都会发现都是通过实现内建类型,它们像子类型一样,更快而且更清晰

#例如

class F(list):

    def __init__(self,a):

        self.a=a

    def dir(self):

        print ‘F.%s‘%self.a

        for i in self:

            print i

f=F(‘secret‘)

print f

f.append(‘pics‘)

f.append(‘apply‘)

f.dir()

#其他

"""

从2.4开始,collections模块已经提供了一些可以用来实现有效容器类型

1:实现双端队列的deque类型

2:defaultdict类型提供了一个类似词典的对象,带有默认未知键码值,与prel或者ruby中的hash工作方式类似

----

内建类型覆盖大部分使用场景

如果打开创建一个类似序列或者映射新类,应该考试其特性并观察已有内建类型.

"""