Python 的 Magic Methods 指南(9)

Python.org/2/library/abc.html。

创建描述器对象

描述器是通过获取、设置以及删除的时候被访问的类。当然也可以改变其它的对象。描述器并不是独立的。相反,它意味着被一个所有者类持有。当创建面向对象的数据库或者类,里面含有相互依赖的属相时,描述器将会非常有用。一种典型的使用方法是用不同的单位表示同一个数值,或者表示某个数据的附加属性(比如坐标系上某个点包含了这个点到原点的距离信息)。

为了成为一个描述器,一个类必须至少有__get__,__set__,__delete__方法被实现,让我们看看这些魔法方法:

__get__(self, instance, owner)

定义了当描述器的值被取得的时候的行为。instance是拥有该描述器对象的一个实例。owner是拥有者本身。

__set__(self, instance, value)

定义了当描述器的值被改变的时候的行为。instance是拥有该描述器类的一个实例。value是要设置的值。

__delete__(self, instance)

定义了当描述器的值被删除的时候的行为。instance是拥有该描述器对象的一个实例。

下面是一个描述器的实例:单位转换。

class Meter(object): '''对于”米“的描述器。''' def __init__(self, value=0.0): self.value = float(value) def __get__(self, instance, owner): return self.value def __set__(self, instance, value): self.value = float(value)class Foot(object): '''对于”英尺“的描述器。''' def __get__(self, instance, owner): return instance.meter * 3.2808 def __set__(self, instance, value): instance.meter = float(value) / 3.2808class Distance(object): '''用米和英寸来表示两个描述器之间的距离。''' meter = Meter() foot = Foot() 复制

有时候,尤其是当你在处理可变对象时,你可能想要复制一个对象,然后对其做出一些改变而不希望影响原来的对象。这就是Python的copy所发挥作用的地方。然而(幸运的是),Python的模块并不是“感性”的,所以我们没必要担心一个基于Linux的机器会突然开始工作,但是我们确实需要告诉Python如何高效地复制一些东西。

__copy__(self)

定义了当对你的类的实例调用copy.copy()时所产生的行为。copy.copy()返回了你的对象的一个浅拷贝——这意味着,当实例本身是一个新实例时,它的所有数据都被引用了——例如,当一个对象本身被复制了,它的数据仍然是被引用的(因此,对于浅拷贝中数据的更改仍然可能导致数据在原始对象的中的改变)。

__deepcopy__(self, memodict={})

定义了当对你的类的实例调用copy.deepcopy()时所产生的行为。copy.deepcopy()返回了你的对象的一个深拷贝——对象和其数据都被拷贝了。memodict是对之前被拷贝的对象的一个缓存——这优化了拷贝过程并且阻止了对递归数据结构拷贝时的无限递归。当你想要进行对一个单独的属性进行深拷贝时,调用copy.deepcopy(),并以memodict为第一个参数。

这些魔法方法的使用例子都是什么?答案和以往一样,当你需要进行和默认行为相比,更细粒度的控制时使用这些方法。例如,你想要复制一个对象,其中以字典的形式(其可能会很大)存储了一个缓存,那么对缓存进行复制可能是没有意义的——如果当该缓存可以在内存中被多个实例共享,那么对其进行复制就确实是没意义的。

Pickling 串行化你的对象

如果你打算与其他python发烧友交换数据,那你一定应该听说过pickling。Pickling是一个串行化Python数据结构的串行化过程,它对于存储、重新取回一个对象这类工作来说真是难以置信的有用。但它也是一些担心和误解的源头。

Pickling是如此的重要,以至于它不仅仅拥有自己的模块(pickling),而且还有自己的协议和“魔术”方法。但首先,我们先简单地介绍一下Pickling如何串行化已存在的类型(如果你已经知道这些了,那么请自行飘过)。

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

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