栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

儿童python教程157:如何使用Python继承机制(子类化内置类型)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

儿童python教程157:如何使用Python继承机制(子类化内置类型)

我们知道,Python 中内置有一个 object 类,它是所有内置类型的共同祖先,也是所有没有显式指定父类的类(包括用户自定义的)的共同祖先。因此在实际编程过程中,如果想实现与某个内置类型具有类似行为的类时,**好的方法就是将这个内置类型子类化。

内置类型子类化,其实就是自定义一个新类,使其继承有类似行为的内置类,通过重定义这个新类实现指定的功能。

举个例子,如下所示创建了一个名为 newDict 的类,其中 newDictError 是自定义的异常类:

class newDictError(ValueError):

  """如果向newDict 添加重复值,则引发此异常"""



class newDict(dict):

  """不接受重复值的字典"""

  def __setitem__(self,key,value):

    if value in self.values():

      if ((key in self and self[key]!=value) or (key not in self)):

        raise newDictError("这个值已经存在,并对应不同的键")

    super().__setitem__(key,value)

demoDict = newDict()

demoDict['key']='value'

demoDict['other_key']='value2'

print(demoDict)

demoDict['other_key']='value'

print(demoDict)
运行结果为:

{'key': 'value', 'other_key': 'value2'}
Traceback (most recent call last):
  File "C:UsersmengmaDesktopdemo.py", line 15, in
    demoDict['other_key']='value'
  File "C:UsersmengmaDesktopdemo.py", line 9, in __setitem__
    raise newDictError("这个值已经存在,并对应不同的键")
newDictError: 这个值已经存在,并对应不同的键

可以看到,newDict 是 Python 中 dict 类型的子类,所以其大部分行为都和 dict 内置类相同,**不同之处在于,newDict 不允许字典中多个键对应相同的值。如果用户试图添加具有相同值的新元素,则会引发 newDictError 异常,并给出提示信息。

由于目前尚未学习如何处理异常,因此这里没有 newDictError 做任何处理,异常处理会在后续章节做详细讲解。


另外,如果查看现有代码你会发现,其实很多类都是对 Python 内置类的部分实现,它们作为子类的速度更快,代码更整洁。

比如,list 类型用来管理序列,如果一个类需要在内部处理序列,那么就可以对 list 进行子类化,示例代码如下:

class myList(list):

  def __init__(self,name):

    self.name = name



  def dir(self,nesting = 0):

    offset = " " * nesting

    print("%s%s/" % (offset,self.name))



    for element in self:

      if hasattr(element , 'dir'):

        element.dir(nesting + 1)

      else:

        print("%s %s" % (offset,element))



demoList = myList('C语言中文网')

demoList.append('http://c.biancheng.net')

print(demoList.dir())
运行结果如下:

C语言中文网/
http://c.biancheng.net
None

其实,除了 Python 中常用的基本内置类型,collections 模块中还额外提供了很多有用的容器,这些容器可以满足大部分情况。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/805964.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号