如何使用Python继承机制(子类化内置类型)
我们知道,Python 中内置有一个 object 类,它是所有内置类型的共同祖先,也是所有没有显式指定父类的类(包括用户自定义的)的共同祖先。因此在实际编程过程中,如果想实现与某个内置类型具有类似行为的类时,最好的方法就是将这个内置类型子类化。
内置类型子类化,其实就是自定义一个新类,使其继承有类似行为的内置类,通过重定义这个新类实现指定的功能。
举个例子,如下所示创建了一个名为 newDict 的类,其中 newDictError 是自定义的异常类:
另外,如果查看现有代码你会发现,其实很多类都是对 Python 内置类的部分实现,它们作为子类的速度更快,代码更整洁。
比如,list 类型用来管理序列,如果一个类需要在内部处理序列,那么就可以对 list 进行子类化,示例代码如下:
内置类型子类化,其实就是自定义一个新类,使其继承有类似行为的内置类,通过重定义这个新类实现指定的功能。
举个例子,如下所示创建了一个名为 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:\Users\mengma\Desktop\demo.py", line 15, in <module>
demoDict['other_key']='value'
File "C:\Users\mengma\Desktop\demo.py", line 9, in __setitem__
raise newDictError("这个值已经存在,并对应不同的键")
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('新宝库') demoList.append('https://www.xinbaoku.com') print(demoList.dir())运行结果如下:
新宝库/
https://www.xinbaoku.com
None
所有教程
- C语言入门
- C语言编译器
- C语言项目案例
- 数据结构
- C++
- STL
- C++11
- socket
- GCC
- GDB
- Makefile
- OpenCV
- Qt教程
- Unity 3D
- UE4
- 游戏引擎
- Python
- Python并发编程
- TensorFlow
- Django
- NumPy
- Linux
- Shell
- Java教程
- 设计模式
- Java Swing
- Servlet
- JSP教程
- Struts2
- Maven
- Spring
- Spring MVC
- Spring Boot
- Spring Cloud
- Hibernate
- Mybatis
- MySQL教程
- MySQL函数
- NoSQL
- Redis
- MongoDB
- HBase
- Go语言
- C#
- MATLAB
- JavaScript
- Bootstrap
- HTML
- CSS教程
- PHP
- 汇编语言
- TCP/IP
- vi命令
- Android教程
- 区块链
- Docker
- 大数据
- 云计算