pytho****@googl*****
pytho****@googl*****
2011年 3月 14日 (月) 01:58:56 JST
Revision: e8d4f3462c Author: INADA Naoki <inada****@klab*****> Date: Sun Mar 13 09:56:59 2011 Log: super() の typo 修正と査読. http://code.google.com/p/python-doc-ja/source/detail?r=e8d4f3462c Modified: /library/functions.rst ======================================= --- /library/functions.rst Mon Feb 14 19:29:52 2011 +++ /library/functions.rst Sun Mar 13 09:56:59 2011 @@ -1251,64 +1251,65 @@ .. function:: super(type[, object-or-type]) - *type* クラスの親、または、兄弟を呼び出すメソッドを代理する、代理オ - ブジェクトを返します。これはクラスの中でオーバーライドされた継承メ - ソッドにアクセスするのに便利です。探索の順序は、 *type* 自身が飛ば - されるとおをのぞいては、 :func:`getattr` と同じです。 + メソッド呼び出しを *type* クラスの親か兄弟クラスに移譲する、プロキシ + オブジェクトを返します。これはクラスの中から、オーバーライドされた + 継承メソッドにアクセスするのに便利です。探索の順序は、 *type* 自身が + 飛ばされるのを除いて、 :func:`getattr` と同じです。 *type* の :attr:`__mro__` 属性は、 :func:`getattr` と :func:`super` - の両方で使われる探索の順序で、メソッドを記載します。 - 属性は、動的で、継承の階層構造が更新されれば、随時変化します。 - - もし、ふたつめの引数が与えられれば、返されるスーパーオブジェクトは - 解放されます。もし、ふたつめの引数がオブジェクトであれば、 - ``isinstance(obj, type)`` は真でなければなりません。もし、ふたつめ - の引数が型であれば、 ``issubclass(type2, type)`` は真でなければなり - ません(これはクラスメソッドにとって役に立つでしょう)。 + の両方で使われるメソッド探索順序を格納しています。 + この属性は動的で、継承の階層構造が更新されれば随時変化します。 + + 2つめの引数が省略されているとき、返されるスーパーオブジェクトは未束縛で す。 + 2つめの引数がオブジェクトであれば、 ``isinstance(obj, type)`` は真に + なります。2つめの引数が型であれば、 ``issubclass(type2, type)`` は真に + なります。(これはクラスメソッドにとって役に立つでしょう)。 .. note:: - :func:`super` は、 :term:`new-style class` でのみ機能します。 - - *super* の典型的な使用例を2例示します。クラスの階層は単一の継承とし、 - *super* は名前を明示することなく親クラスを参照することができるとし - ます。コードはメンテナンスが容易になるようにします。この用途の - *super* は他のプログラミング言語で見られるものと同じ方向性です。 - - ふたつめの使用例は、動的な実行環境下での複数の継承をサポートするた - めのものです。この用途は Python 特有で単一の継承しかサポートしない - 言語や、静的なコンパイルが必要となる言語では見られないものです。こ - れは "diamond diagrams" のような、複数の基底クラスが同じメソッドを - 実装することを可能とします。良い設計は、すべてのこのメソッドが同じ - 呼び出し規約を持つことを要求します(呼び出しが実行時に決定されること - や、クラスの階層の変更に対応させることや、実行時に優先される未知の - 兄弟クラスに対応することのためです)。 + :func:`super` は、新スタイルクラス(:term:`new-style class`)でのみ + 機能します。 + + *super* の典型的なユースケースは2種類あります。 + クラスが単一継承である場合、 *super* は親クラスを、名前を明示することな く + 参照することができます。 + これはコードのメンテナンス性を向上します。この用途の *super* は他の + プログラミング言語で見られるものと同じです。 + + 2つめの典型的なユースケースは、動的な実行環境下で協調的な多重継承をサ ポート + するためのものです。この用途は Python 特有のもので、単一の継承しかサポー ト + しない言語や、静的なコンパイルが必要となる言語では見られないものです。 + これは "diamond diagrams" において、複数の基底クラスが同じメソッドを実装 する + ことを可能とします。良い設計は、すべてのこのメソッドが同じ呼び出し規約を 持つ + ことを要求します(呼び出しが実行時に決定されることや、クラスの階層の変更 に + 対応させることや、実行時に優先される未知の兄弟クラスに対応することのため です)。 両方のケースにおいて、典型的なスーパークラスの呼び出しはこのように - なるでしょう。:: + なるでしょう。 :: class C(B): def method(self, arg): super(C, self).method(arg) - :func:`super` は ``super(C, self).__getitem__(name)`` のような明示的 - なドット表記の属性参照の一部として使われているので注意してください。 - :meth:`__getattribute__` メソッドは予期される順番で検索されるように - 実装されており、複数の継承がサポートできるようになっています。 - これに伴って、 :func:`super` は ``super()[name]`` のような文や演算 - 子を使った非明示的な属性参照向けには定義されていないので注意してく - ださい。 - - また、 :func:`super` の使用がメソッド内部に限定されないことにも注目 - して下さい。ふたつの引数が引数を規定し、適当な参照となります。 + :func:`super` は ``super(C, self).__getitem__(name)`` のような明示的な + ドット表記による属性参照の一部として使うように実装されています。 + これは、 :meth:`__getattribute__` メソッドを、協調的な多重継承をサポート + するための予測可能な順序でクラスを検索するように実装することで実現されて + います。 + 従って、 :func:`super` は ``super()[name]`` のような文や演算子を使った + 非明示的な属性参照向けには定義されていないので注意してください。 + + また、 :func:`super` の使用がメソッド内部に限定されないことにも注目して + 下さい。引数を2つ渡す形式の呼び出しは、必要な要素を正確に指定するので、 + 適当な参照を作ることができます。 .. versionadded:: 2.2 .. function:: tuple([iterable]) - *iterable* の要素と要素が同じで、かつ順番も同じになるタプルを返しま - す。 *iterable* はシーケンス、反復をサポートするコンテナ、およびイ - テレータオブジェクトをとることができます。 *iterable* がすでにタプ + *iterable* の要素と要素が同じで、かつ順番も同じになるタプルを返します。 + *iterable* はシーケンス型、反復をサポートするコンテナ型、および + イテレータオブジェクトをとることができます。 *iterable* がすでにタプ ルの場合、そのタプルを変更せずに返します。 例えば、 ``tuple('abc')`` は ``('a', 'b', 'c')`` を返し、 ``tuple([1, 2, 3])`` は ``(1, 2, 3)`` を返します。