Python的子类化内置类型非常的简单。有一个叫做object的内置类型,它是所有内置类型的共同祖先,也是所有没有显示指定父类的自定义类的共同祖先。正因如此,每当需要实现与某个内置类型具有相同行为的类时,最好的方法就是把这个内置类型子类化。


例如我们需要一个不允许多个键对应同一个值得dict,如果试图添加具有相同值的新元素,那么就会引发一个ValueError的子类并给出一些帮助信息。

class DistError(ValueError):
   pass


class MessageDict(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 DistError("The value already exists!")

      super().__setitem__(key, value)
      
>>> test_dict = MessageDict()
>>> test_dict["name"] = "tianxiaoyong"
>>> print(test_dict)
{"name": "tianxiaoyong"}
>>> test_dict["name_1"] = "tianxiaoyong"
Traceback (most recent call last):
  File "D:/devCodes/Python/developDir/test.py", line 162, in <module>
    test["name_1"] = "tianxiaoyong"
  File "D:/devCodes/Python/developDir/test.py", line 155, in __setitem__
    raise DistError("The value already exists!")
__main__.DistError: The value already exists!

细心的你如果有仔细看过一些第三方包的源码,你会发现许多类都是对内置类型的部分实现,它们作为子类的速度更快,代码也更加的简洁。举个例子,我们用list类型来管理序列,如果一个类需要在内部处理序列,那么就可以对list进行子类化。

class Folder(list):
    def __init__(self, name):
        self.name = name
        super().__init__()

    def dir(self, nesting=0):
        offset = " " * nesting
        print("%s %s" % (offset, self.name))
        for el in self:
            if hasattr(el, "dir"):
                el.dir(nesting + 1)
            else:
                print("%s    %s" % (offset, el))
                
                
>>> project = Folder("project")
>>> src = Folder("src")
>>> project.append("README.MD")
>>> src.append("manage.py")
>>> project.dir()
 project
    README.MD
>>> src.dir()
 src
    manage.py

内置类型覆盖了大部分的使用场景
如果打算创建一个与序列或者映射类似的新类,应考虑其性能并查看现有的内置类型。除了基本的内置类型,collections模块还提供了额外的许多有用的容器。

最后修改:2020 年 09 月 10 日 10 : 14 AM
如果觉得我的文章对你有用,请随意赞赏