Python 的 Magic Methods 指南(7)

不需要再等待了,这里就是容器所使用的一些魔法方法。

一个例子

对于我们的例子, 让我们看看一个列表,它实现了一些功能结构,你可能在其他在其他程序中用到 (例如Haskell).

class FunctionalList: '''A class wrapping a list with some extra functional magic, like head, tail, init, last, drop, and 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): # if key is of invalid type or value, the list values will raise the error 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): # get the first element return self.values[0] def tail(self): # get all elements after the first return self.values[1:] def init(self): # get elements up to the last return self.values[:-1] def last(self): # get last element return self.values[-1] def drop(self, n): # get all elements except first n return self.values[n:] def take(self, n): # get first n elements return self.values[:n]

这样你拥有了它,如何实现自己的序列的,有点用的例子。当然,也有更有用的应用程序的自定义序列,但在标准库中,已经有相当多的实现(包括电池,对吧?),像Counter,OrderedDict,和NamedTuple。

反射

你也可以控制怎么使用内置在函数sisinstance()和issubclass()方法 反射定义魔法方法. 这个魔法方法是:

__instancecheck__(self, instance)

检查对象是否是您定义的类的一个实例(例.isinstance(instance, class).

__subclasscheck__(self, subclass)

检查类是否是你定义类的子类 (例.issubclass(subclass, class)).

这些魔法方法的用例看起来很小, 并且确实非常实用. 我不想花太多时间在反射魔法方法上,因为它们不是非常重要, 但是它们反应了关于面向对象程序上一些重要的东西在Python上,并且总的来说Python: 总是一个简单的方法去找某些事情, 即使是没有必要的. 这些魔法方法可能看起来不是很有用, 但是一旦你需要它们,你会感到庆幸它们的存在 (并且为自己阅读了本指南高兴!).

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/cb1b2f78dd9df2088d69413cabe7ac94.html