内置类型子类化,其实就是自定义一个新类,使其继承有类似行为的内置类,通过重定义这个新类实现指定的功能。
举个例子,如下所示创建了一个名为 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: 这个值已经存在,并对应不同的键
由于目前尚未学习如何处理异常,因此这里没有 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



