Skip to content

Commit

Permalink
Update first part of article 'Descriptor-HOW-TO-Guide.rst'.
Browse files Browse the repository at this point in the history
  • Loading branch information
Zhang Xuanyi committed Nov 25, 2014
1 parent 39e3e33 commit d5f6f52
Showing 1 changed file with 8 additions and 8 deletions.
16 changes: 8 additions & 8 deletions docs/Descriptor-HOW-TO-Guide.rst
Original file line number Diff line number Diff line change
Expand Up @@ -17,18 +17,18 @@ Python描述器引导(翻译)
摘要
----

定义描述器, 总结协定,并展示描述器怎么被调用的。测试一个普通的描述器和包括方法,属性(property), 静态方法(static method), 类方法在内的几个Python内置描述器。通过给出一个纯Python的等价和应用来展示每个是怎么工作的
定义描述器, 总结描述器协定,并展示描述器怎么被调用的。测试一个普通的描述器和包括方法,属性(property), 静态方法(static method), 类方法在内的几个Python内置描述器。通过给出一个纯Python的实现和示例应用来展示每个描述器是怎么工作的

学习描述器不仅让你接触到更多的工具,描述器让我们更深入地了解Python是如何工作的,体现了Python设计的优雅之处
学习描述器不仅让你接触到更多的工具,还可以让你更深入地了解Python是如何工作的,让你体会到Python设计的优雅之处

定义和介绍
----------

一般来说,一个描述器是一个有“监听行为”的属性,它的控制被描述器的方法重写。这些方法是 :meth:`__get__`, :meth:`__set__`, 和 :meth:`__delete__`.有这些方法的对象叫做描述器。
一般来说,一个描述器是一个有“绑定行为”的对象属性,它的访问控制被描述器协定方法重写。这些方法是 :meth:`__get__`, :meth:`__set__`, 和 :meth:`__delete__`.有这些方法的对象叫做描述器。

默认对属性的控制是从对象的字典里面(__dict__)中获取(get), 设置(set)和删除(delete)它.对于实例 ``a`` 来说, ``a.x`` 的查找顺序是, ``a.__dict__['x']`` , 然后 ``type(a).__dict__['x']`` , 然后找 ``type(a)`` 的父类(不包括元类).如果查找到的值是一个描述器, Python就会用描述器的方法来重写默认的控制行为。这个重写发生在这个查找环节的哪里取决于定义了哪个描述器方法。注意, 描述器只有当它是个新式类的实例时才被调用(新式类是继承自 ``type`` 或者 ``object`` 的类) (注:亦即描述器的类应为新式类)
默认对属性的访问控制是从对象的字典里面(__dict__)中获取(get), 设置(set)和删除(delete)它.对于实例 ``a`` 来说, ``a.x`` 的查找顺序是, ``a.__dict__['x']`` , 然后 ``type(a).__dict__['x']`` , 然后找 ``type(a)`` 的父类(不包括元类(metaclass)).如果查找到的值是一个描述器, Python就会调用描述器的方法来重写默认的控制行为。这个重写发生在这个查找环节的哪里取决于定义了哪个描述器方法。注意, 只有在新式对象或新式类中时描述器才会起作用。(新式类是继承自 ``type`` 或者 ``object`` 的类)

描述器是强大的,应用广泛的。描述器正是属性, 实例方法, 静态方法, 类方法,和 ``super`` 的实现原理.描述器在Python被用于实现Python 2.2中引入的新式类。
描述器是强大的,应用广泛的。描述器正是属性, 实例方法, 静态方法, 类方法和 ``super`` 的背后的实现机制。描述器在Python自身中广泛使用,以实现Python 2.2中引入的新式类。描述器简化了底层的C代码,并为Python的日常编程提供了一套灵活的新工具

描述器协定
----------
Expand All @@ -39,13 +39,13 @@ Python描述器引导(翻译)

``descr.__delete__(self, obj) --> None``

这是所有描述器方法。一个对象被定义了这些任一个方法就会成为描述器,可以重写默认的查找属性的行为
这是所有描述器方法。一个对象具有其中任一个方法就会成为描述器,从而在被当作对象属性时重写默认的查找行为

如果一个对象同时定义了 :meth:`__get__` 和 :meth:`__set__`,它叫做资料描述器(data descriptor)。仅定义了 :meth:`__get__` 的描述器叫非资料描述器(特别用于方法,当然其他用途也是可能的)
如果一个对象同时定义了 :meth:`__get__` 和 :meth:`__set__`,它叫做资料描述器(data descriptor)。仅定义了 :meth:`__get__` 的描述器叫非资料描述器(常用于方法,当然其他用途也是可以的)

资料描述器和非资料描述器的区别在于:相对于实例的字典的优先级。如果实例字典中有与描述器同名的属性,如果描述器是资料描述器,优先使用资料描述器,如果是非资料描述器,优先使用字典中的属性。(译者注:这就是为何实例 ``a`` 的方法和属性重名时,比如都叫 ``foo`` Python会在访问 ``a.foo`` 的时候优先访问实例字典中的属性,因为实例函数的实现是个非资料描述器)

要想制作一个只读的资料描述器,需要同时定义 ``__set__`` 和 ``__get__``,并在 ``__set__`` 中引发一个 ``AttributeError`` 异常。
要想制作一个只读的资料描述器,需要同时定义 ``__set__`` 和 ``__get__``,并在 ``__set__`` 中引发一个 ``AttributeError`` 异常。定义一个引发异常的 ``__set__`` 方法就足够让一个对象成为资料描述器。

描述器的调用
------------
Expand Down

0 comments on commit d5f6f52

Please sign in to comment.