Benutzerdefinie...LOGIN

Benutzerdefinierter Container (Container)

Nach der Einführung im vorherigen Kapitel wissen wir, dass in Python gängige Containertypen sind: dict, tuple, list, string. Die Konzepte von containerisierten und unveränderlichen Containern werden ebenfalls erwähnt. Unter diesen sind Tupel und String unveränderliche Container, und Diktat und Liste sind veränderliche Container. Der Unterschied zwischen einem veränderlichen Container und einem unveränderlichen Container besteht darin, dass ein Element darin nicht mehr geändert werden kann, sobald einem unveränderlichen Container ein Wert zugewiesen wurde. Für eine ausführliche Einführung können Sie sich natürlich auch den vorherigen Artikel mit Bildern und Texten durchlesen.

Hier stellt sich zunächst die Frage: Reichen diese Datenstrukturen aus, damit wir sie entwickeln und nutzen können? Was sollen wir tun, wenn es nicht ausreicht oder wenn es besondere Anforderungen gibt, die mit diesen Basisbehältern allein nicht gelöst werden können?

Zu diesem Zeitpunkt müssen wir den Container anpassen. Wie sollen wir das tun?

功能说明
自定义不可变容器类型需要定义 __len__ 和 __getitem__ 方法
自定义可变类型容器在不可变容器类型的基础上增加定义 __setitem__ 和 __delitem__
自定义的数据类型需要迭代需定义 __iter__
返回自定义容器的长度需实现 __len__(self)
自定义容器可以调用 self[key] ,如果 key 类型错误,抛出TypeError ,如果没法返回key对应的数值时,该方法应该抛出ValueError 需要实现 __getitem__(self, key)
当执行 self[key] = value 时调用是 __setitem__(self, key, value)这个方法
当执行 del self[key] 方法其实调用的方法是 __delitem__(self, key)
当你想你的容器可以执行 for x in container: 或者使用 iter(container) 时需要实现 __iter__(self) ,该方法返回的是一个迭代器

Sehen wir uns die Verwendung der oben genannten magischen Methode an, um eine Datenstruktur in der Haskell-Sprache zu implementieren:

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
class FunctionalList:
    ''' 实现了内置类型list的功能,并丰富了一些其他方法: head, tail, init, last, drop, take'''
    def __init__(self, values=None):
        if values is None:
            self.values = []
        else:
            self.values = values
    def __len__(self):
        return len(self.values)
    def __getitem__(self, key):
        return self.values[key]
    def __setitem__(self, key, value):
        self.values[key] = value
    def __delitem__(self, key):
        del self.values[key]
    def __iter__(self):
        return iter(self.values)
    def __reversed__(self):
        return FunctionalList(reversed(self.values))
    def append(self, value):
        self.values.append(value)
    def head(self):
        # 获取第一个元素
        return self.values[0]
    def tail(self):
        # 获取第一个元素之后的所有元素
        return self.values[1:]
    def init(self):
        # 获取最后一个元素之前的所有元素
        return self.values[:-1]
    def last(self):
        # 获取最后一个元素
        return self.values[-1]
    def drop(self, n):
        # 获取所有元素,除了前N个
        return self.values[n:]
    def take(self, n):
        # 获取前N个元素
        return self.values[:n]


nächsten Abschnitt
KapitelKursunterlagen