pytho****@googl*****
pytho****@googl*****
2011年 3月 13日 (日) 03:21:04 JST
Revision: 6aa8caceae Author: MATSUI Tetsushi <matsu****@gmail*****> Date: Sat Mar 12 10:19:19 2011 Log: 2.6.6: library/numbers (+ issue11475) http://code.google.com/p/python-doc-ja/source/detail?r=6aa8caceae Modified: /library/numbers.rst ======================================= --- /library/numbers.rst Sun Jul 19 11:52:44 2009 +++ /library/numbers.rst Sat Mar 12 10:19:19 2011 @@ -6,14 +6,14 @@ .. versionadded:: 2.6 -:mod:`numbers` モジュール (:pep:`3141`) は数の抽象基底クラスの、\ -順により多くの演算を定義していく階層を定義します。このモジュールで\ +:mod:`numbers` モジュール (:pep:`3141`) は数の抽象基底クラスの、 +順により多くの演算を定義していく階層を定義します。このモジュールで 定義される型はどれもインスタンス化できません。 .. class:: Number - 数の階層の根。引数 *x* が、種類は何であれ、数であるということだけ\ + 数の階層の根。引数 *x* が、種類は何であれ、数であるということだけ チェックしたい場合、 ``isinstance(x, Number)`` が使えます。 @@ -22,19 +22,19 @@ .. class:: Complex - この型のサブクラスは複素数を表し、組み込みの :class:`complex` 型を受け付 ける\ + この型のサブクラスは複素数を表し、組み込みの :class:`complex` 型を受け付 ける 演算を含みます。それらは: :class:`complex` および :class:`bool` への変 換、 :attr:`.real`, :attr:`.imag`, ``+``, ``-``, ``*``, ``/``, :func:`abs`, - :meth:`conjugate`, ``==`` そして ``!=`` です。 ``-`` と ``!=`` 以外の\ + :meth:`conjugate`, ``==``, ``!=`` です。 ``-`` と ``!=`` 以外の 全てのものは抽象的です。 .. attribute:: real - 抽象的。この複素数の(実数)部分を :class:`Real` で取り出します。 + 抽象的。この複素数の実数部分を取り出します。 .. attribute:: imag - 抽象的。この複素数の(虚数)部分を :class:`Real` で取り出します。 + 抽象的。この複素数の虚数部分を取り出します。 .. method:: conjugate() @@ -45,12 +45,13 @@ :class:`Complex` の上に、 :class:`Real` は実数で意味を成す演算を加えま す。 - 簡潔に言うとそれらは: :class:`float` への変換, :func:`trunc`, + 簡潔に言うとそれらは: :class:`float` への変換, :func:`math.trunc`, :func:`round`, :func:`math.floor`, :func:`math.ceil`, :func:`divmod`, ``//``, ``%``, ``<``, ``<=``, ``>`` および ``>=`` です。 Real はまた :func:`complex`, :attr:`~Complex.real`, - :attr:`~Complex.imag` および :meth:`~Complex.conjugate` のデフォルトを提 供します。 + :attr:`~Complex.imag` および :meth:`~Complex.conjugate` + のデフォルトを提供します。 .. class:: Rational @@ -100,7 +101,7 @@ さらに数のABCを追加する ~~~~~~~~~~~~~~~~~~~~~~~~ -もちろん、他にも数に対する ABC が有り得ますし、そういったものを付け加える可 能性を\ +もちろん、他にも数に対する ABC が有り得ますし、そういったものを付け加える可 能性を 閉ざしてしまうとすれば貧相な階層でしかありません。たとえば ``MyFoo`` を :class:`Complex` と :class:`Real` の間に付け加えるには:: @@ -111,10 +112,10 @@ 算術演算の実装 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -私たちは、混在型(mixed-mode)演算について作者が両方の引数の型について知って いる\ -ような実装を呼び出すか、両方を最も近い組み込み型に変換してそこで演算する か、どち\ -らかを行うように算術演算を実装したいのです。 :class:`Integral` のサブタイプ に\ -対して、このことは :meth:`__add__` と :meth:`__radd__` が次のように定義され る\ +私たちは、混在型(mixed-mode)演算について作者が両方の引数の型について知って いる +ような実装を呼び出すか、両方を最も近い組み込み型に変換してそこで演算する か、 +どちらかを行うように算術演算を実装したいのです。 :class:`Integral` のサブタ イプに +対して、このことは :meth:`__add__` と :meth:`__radd__` が次のように定義され る べきであることを意味します:: class MyIntegral(Integral): @@ -144,33 +145,32 @@ ここには5つの異なる :class:`Complex` のサブクラス間の混在型の演算がありま す。 上のコードの中で ``MyIntegral`` と ``OtherTypeIKnowAbout`` に触れない部分を -"ボイラープレート" と呼ぶことにしましょう。 ``a`` を :class:`Complex` の\ +"ボイラープレート" と呼ぶことにしましょう。 ``a`` を :class:`Complex` の サブタイプである ``A`` のインスタンス (``a : A <: Complex``)、同様に ``b : B <: Complex`` として、 ``a + b`` を考えます: - 1. ``A`` が ``b`` を受け付ける :meth:`__add__` を定義している場合、\ + 1. ``A`` が ``b`` を受け付ける :meth:`__add__` を定義している場合、 何も問題はありません。 2. ``A`` でボイラープレート部分に落ち込み、その結果 :meth:`__add__` - が値を返すならば、 ``B`` に良く考えられた :meth:`__radd__` が定義\ + が値を返すならば、 ``B`` に良く考えられた :meth:`__radd__` が定義 されている可能性を見逃してしまいますので、ボイラープレート は :meth:`__add__` から :const:`NotImplemented` を返すのが良いでしょう。(若しくは、 ``A`` はまったく :meth:`__add__` を実装すべきではなかったかもしれません。) 3. そうすると、 ``B`` の :meth:`__radd__` にチャンスが巡ってきます。 ここで ``a`` が受け付けられるならば、結果は上々です。 - 4. ここでボイラープレートに落ち込むならば、もう他に試すべきメソッドはあ り\ - ませんので、デフォルト実装の出番です。 + 4. ここでボイラープレートに落ち込むならば、もう他に試すべきメソッドは + ありませんので、デフォルト実装の出番です。 5. もし ``B <: A`` ならば、Python は ``A.__add__`` の前に ``B.__radd__`` - を試します。これで良い理由は、 ``A`` についての知識を持って実装して お\ - り、 :class:`Complex` に委ねる前にこれらのインスタンスを扱えるはずだ か\ - らです。 + を試します。これで良い理由は、 ``A`` についての知識を持って実装して おり、 + :class:`Complex` に委ねる前にこれらのインスタンスを扱えるはずだから です。 もし ``A <: Complex`` かつ ``B <: Real`` で他に共有された知識が無いならば、 適切な共通の演算は組み込みの :class:`complex` を使ったものになり、 どちらの :meth:`__radd__` ともそこに着地するでしょうから、 ``a+b == b+a`` です。 -ほとんどの演算はどのような型についても非常に良く似ていますので、\ -与えられた演算子について順結合(forward)および逆結合(reverse)のメソッドを生 成\ +ほとんどの演算はどのような型についても非常に良く似ていますので、 +与えられた演算子について順結合(forward)および逆結合(reverse)のメソッドを生 成 する支援関数を定義することは役に立ちます。たとえ ば、 :class:`fractions.Fraction` では次のようなものを利用しています::