pytho****@googl*****
pytho****@googl*****
2011年 2月 10日 (木) 21:43:08 JST
Revision: 080bb9ccff Author: INADA Naoki <inada****@klab*****> Date: Thu Feb 10 04:41:15 2011 Log: tutorial/classes.rst 差分翻訳 http://code.google.com/p/python-doc-ja/source/detail?r=080bb9ccff Modified: /tutorial/classes.rst /tutorial/diff/classes.rst.diff ======================================= --- /tutorial/classes.rst Mon Nov 22 18:20:29 2010 +++ /tutorial/classes.rst Thu Feb 10 04:41:15 2011 @@ -4,86 +4,91 @@ クラス ****** -Python では、最小限の構文と意味付けを使ってクラス (class) のメカニズムを言 語に追加しています。Python のクラスは、C++ と -Modula-3 で見られるクラスメカニズムを混合したものです。モジュールがそうであ るように、 Python -におけるクラスでは、クラス定義とユーザとの間に絶対的な障壁をおかず、ユーザ が礼儀正しく、 "定義に首を突っ込む" ことはないと -あてにしています。とはいえ、クラスにおける最も重要な機能はそのままに、完全 な力を持っています: クラスの継承 (inheritance) メカニズムでは、 -複数の基底クラスを持つことができ、導出されたクラスでは基底クラスの任意のメ ソッドをオーバライド (override, 上書き) することができます。 -メソッドでは、基底クラスのメソッドを同じ名前で呼び出すことができます。オブ ジェクトには任意のプライベートなデータを入れることができます。 - -.. % Classes -.. % % Python's class mechanism adds classes to the language with a minimum -.. % % of new syntax and semantics. It is a mixture of the class mechanisms -.. % % found in \Cpp{} and Modula-3. As is true for modules, classes in Python -.. % % do not put an absolute barrier between definition and user, but rather -.. % % rely on the politeness of the user not to ``break into the -.. % % definition.'' The most important features of classes are retained -.. % % with full power, however: the class inheritance mechanism allows -.. % % multiple base classes, a derived class can override any methods of its -.. % % base class or classes, and a method can call the method of a base class with the -.. % % same name. Objects can contain an arbitrary amount of private data. - -C++ の用語では、全てのクラスメンバ (データメンバも含む) は *public* (公開さ れたデータ) であり、メンバ関数はすべて *仮想関数 -(virtual)* です。特別なコンストラクタ (constructor: 生成関数) やデストラク タ (destructor: 破壊関数) -はありません。Module-3 にあるような、オブジェクトのメンバをメソッドから参照 するために短縮した記法は使えません: -メソッド関数の宣言では、オブジェクト自体を表すパラメタ第一引数に明示せねば なりません。第一引数のオブジェクトはメソッド呼び -出しの際に暗黙の引数として渡されます。Smalltalk に似て、クラスはそれ自体が オブジェクトです。とはいえ、これは広義のオブジェクトという意味で、 -Python では全てのデータ型はオブジェクトです。このことは、import や名前変更 といった操作のセマンティクスにつながります。 C++ や -Modula-3 と違って、ユーザは組込みの型を基底クラスにして拡張を行えます。ま た、C++ とは同じで Modula-3 とは違う点として、特別な -構文を伴うほとんどの組み込み演算子 (算術演算子 (arithmetic operator) や添字 表記) はクラスインスタンスで使うために再定義できます。 - -.. % % In \Cpp{} terminology, all class members (including the data members) are -.. % % \emph{public}, and all member functions are \emph{virtual}. There are -.. % % no special constructors or destructors. As in Modula-3, there are no -.. % % shorthands for referencing the object's members from its methods: the -.. % % method function is declared with an explicit first argument -.. % % representing the object, which is provided implicitly by the call. As -.. % % in Smalltalk, classes themselves are objects, albeit in the wider -.. % % sense of the word: in Python, all data types are objects. This -.. % % provides semantics for importing and renaming. Unlike -.. % % \Cpp{} or Modula-3, built-in types can be used as base classes for -.. % % extension by the user. Also, like in \Cpp{} but unlike in Modula-3, most -.. % % built-in operators with special syntax (arithmetic operators, -.. % % subscripting etc.) can be redefined for class instances. - - -.. _tut-terminology: - -用語について一言 -================ - -クラスに関して広範に受け入れられている用語定義がないので、 Smalltalk と C++ の用語を場合に応じて使っていくことにします。 -(オブジェクト指向における意味付けの方法は C++よりも Modula-3 のほうが Python に近いので Modula-3 の用語を使いたいのですが、 -ほとんどの読者はそれを耳にしたことがないと思います。) - -.. % A Word About Terminology -.. % % Lacking universally accepted terminology to talk about classes, I will -.. % % make occasional use of Smalltalk and \Cpp{} terms. (I would use Modula-3 -.. % % terms, since its object-oriented semantics are closer to those of -.. % % Python than \Cpp, but I expect that few readers have heard of it.) - -オブジェクトには個体性があり、同一のオブジェクトに (複数のスコープの) 複数 の名前を割り当てることができます。この機能は他の言語では別名 (ailias) -づけとして知られています。Python を一見しただけでは、別名づけの重要性は分か らないことが多く、変更不能な基本型 (数値、文字列、タプル) -を扱うときには無視して差し支えありません。しかしながら、別名付けには、リス トや辞書、またプログラムの外部にある実体 (ファイル、ウィンドウ、など) -を表現するためのほとんどの型が入った Python コードで意味付けを行う上で (意 図的な!) 効果があります。 -別名付けはいくつかの点でポインタのように振舞うので、通常はプログラムに利す るように使われます。例えば、オブジェクトの受け渡しは、実装上は -ポインタが渡されるだけなのでコストの低い操作になります; また、関数があるオ ブジェクトを引数として渡されたとき、関数の呼び出し側から -オブジェクトに対する変更を見ることができます --- これにより、 Pascal にある ような二つの引数渡し機構をもつ必要をなくしています。 - -.. % % Objects have individuality, and multiple names (in multiple scopes) -.. % % can be bound to the same object. This is known as aliasing in other -.. % % languages. This is usually not appreciated on a first glance at -.. % % Python, and can be safely ignored when dealing with immutable basic -.. % % types (numbers, strings, tuples). However, aliasing has an -.. % % (intended!) effect on the semantics of Python code involving mutable -.. % % objects such as lists, dictionaries, and most types representing -.. % % entities outside the program (files, windows, etc.). This is usually -.. % % used to the benefit of the program, since aliases behave like pointers -.. % % in some respects. For example, passing an object is cheap since only -.. % % a pointer is passed by the implementation; and if a function modifies -.. % % an object passed as an argument, the caller will see the change --- this -.. % % obviates the need for two different argument passing mechanisms as in -.. % % Pascal. +.. Python's class mechanism adds classes to the language with a minimum of new + syntax and semantics. It is a mixture of the class mechanisms found in C++ and + Modula-3. As is true for modules, classes in Python do not put an absolute + barrier between definition and user, but rather rely on the politeness of the + user not to "break into the definition." The most important features of classes + are retained with full power, however: the class inheritance mechanism allows + multiple base classes, a derived class can override any methods of its base + class or classes, and a method can call the method of a base class with the same + name. Objects can contain an arbitrary amount of data. + +Python は、最小限の構文と意味付けを使ってクラスを言語に追加しています。 +Python のクラスは、 C++ と Modula-3 のクラスメカニズムを混ぜたものです。 +モジュールと同じく、 Python におけるクラスでは、クラス定義とユーザとの間に +絶対的な障壁をおかず、ユーザが礼儀正しく、 "定義の邪魔をする" ことはないと あてにしています。 +とはいえ、クラスにおける最も重要な機能は、完全な力を持ったままです: +クラスの継承メカニズムは、複数の基底クラスを持つことができ、 +導出されたクラスでは基底クラスの任意のメソッドをオーバライドすることができ ます。 +メソッドでは、基底クラスのメソッドを同じ名前で呼び出すことができます。 +オブジェクトには任意のデータを入れることができます。 + +.. In C++ terminology, all class members (including the data members) are *public*, + and all member functions are *virtual*. As in Modula-3, there are no shorthands + for referencing the object's members from its methods: the method function is + declared with an explicit first argument representing the object, which is + provided implicitly by the call. As in Smalltalk, classes themselves are + objects. This provides semantics for importing and renaming. Unlike C++ and + Modula-3, built-in types can be used as base classes for extension by the user. + Also, like in C++, most built-in operators with special syntax (arithmetic + operators, subscripting etc.) can be redefined for class instances. + +C++ の用語で言えば、全てのクラスメンバ (データメンバも含む) は *public* +(公開されたデータ) であり、メンバ関数はすべて *仮想関数(virtual)* です。 +Module-3 にあるような、オブジェクトのメンバをメソッドから参照するための +短縮した記法は使えません: +メソッド関数の宣言では、オブジェクト自体を表す第一引数を明示せねばなりませ ん。 +第一引数のオブジェクトはメソッド呼び出しの際に暗黙の引数として渡されます。 +Smalltalk に似て、クラスはそれ自体がオブジェクトです。 +そのため、 import や名前変更といった操作が可能です。 +C++ や Modula-3 と違って、ユーザーは組込み型を基底クラスにして拡張を行えま す。 +また、C++ とは同じで Modula-3 とは違う点として、特別な構文を伴うほとんどの +組み込み演算子 (算術演算子 (arithmetic operator) や添字表記) +はクラスインスタンスで使うために再定義できます。 + +.. (Lacking universally accepted terminology to talk about classes, I will make + occasional use of Smalltalk and C++ terms. I would use Modula-3 terms, since + its object-oriented semantics are closer to those of Python than C++, but I + expect that few readers have heard of it.) + +(クラスに関して普遍的な用語定義がないので、 Smalltalk と C++ +の用語を場合に応じて使っていくことにします。 +C++ よりも Modula-3 の方がオブジェクト指向の意味論が Python に近いので、 +Modula-3 の用語を使いたいのですが、ほとんどの読者は Modula-3 について +しらないでしょうから。) + + +.. _tut-object: + +名前とオブジェクトについて +============================== + +.. A Word About Names and Objects + +.. Objects have individuality, and multiple names (in multiple scopes) can be bound + to the same object. This is known as aliasing in other languages. This is + usually not appreciated on a first glance at Python, and can be safely ignored + when dealing with immutable basic types (numbers, strings, tuples). However, + aliasing has a possibly surprising effect on the semantics of Python code + involving mutable objects such as lists, dictionaries, and most other types. + This is usually used to the benefit of the program, since aliases behave like + pointers in some respects. For example, passing an object is cheap since only a + pointer is passed by the implementation; and if a function modifies an object + passed as an argument, the caller will see the change --- this eliminates the + need for two different argument passing mechanisms as in Pascal. + +オブジェクトには個体性があり、同一のオブジェクトに(複数のスコープから) +複数の名前を割り当てることができます。 +この機能は他の言語では 別名づけ(ailias) として知られています。 +Python を一見しただけでは、別名づけの重要性は分からないことが多く、 +変更不能な基本型 (数値、文字列、タプル)を扱うときには無視して差し支えありま せん。 +しかしながら、別名付けは、リストや辞書や他の多くの型など、変更可能な型を扱 う +Python コード上で驚くべき効果があります。 +別名付けはいくつかの点でポインタのように振舞い、このことは通常はプログラム に利するように使われます。 +例えば、オブジェクトの受け渡しは、実装上はポインタが渡されるだけなのでコス トの低い操作になります。 +また、関数があるオブジェクトを引数として渡されたとき、関数の呼び出し側から +オブジェクトに対する変更を見ることができます --- これにより、 Pascal にある ような二つの引数渡し機構をもつ必要をなくしています。 .. _tut-scopes: @@ -91,9 +96,12 @@ Python のスコープと名前空間 =========================== -クラスを紹介する前に、Python のスコープ規則についてあることを話しておかなけ ればなりません。クラス定義はある巧みなトリックを名前空間に -施すので、何が起こっているのかを完全に理解するには、スコープと名前空間がど のように動作するかを理解する必要があります。ちなみに、この問題に関する知識は 全ての -Python プログラマにとって有用です。 +クラスを紹介する前に、Python のスコープのルールについてあることを +話しておかなければなりません。 +クラス定義はある巧みなトリックを名前空間に施すので、 +何が起こっているのかを完全に理解するには、スコープと名前空間が +どのように動作するかを理解する必要があります。 +ちなみに、この問題に関する知識は全ての Python プログラマにとって有用です。 .. % Python Scopes and Name Spaces .. % % Before introducing classes, I first have to tell you something about @@ -106,12 +114,16 @@ .. % % Let's begin with some definitions. -*名前空間 (namespace)* とは、名前からオブジェクトへの対応付け (mapping) で す。ほとんどの名前空間は、現状では Python -の辞書として実装されていますが、そのことは通常は (パフォーマンス以外では) 目立つことはないし、将来は変更されるかもしれません。 -名前空間の例には、組込み名の集合 (:func:`abs` 等の関数や組込み例外名)、モジ ュールないのグローバルな名前; 関数を呼び出したときの -ローカルな名前、があります。その意味では、オブジェクトの属性からなる集合も また、名前空間を形成します。名前空間について知っておくべき -重要なことは、異なった名前空間にある名前の間には全く関係がないということで す; 例えば、二つの別々のモジュールの両方で関数 "maximize" -という関数を定義することができ、定義自体は混同されることはありません --- モジュールのユーザは名前の前にモジュール名をつけなければなりません。 +*名前空間 (namespace)* とは、名前からオブジェクトへの対応付け (mapping) で す。 +ほとんどの名前空間は、現状では Python の辞書として実装されていますが、 +そのことは通常は (パフォーマンス以外では) 目立つことはないし、将来は変更さ れるかもしれません。 +名前空間の例には、組込み名の集合 (:func:`abs` 等の関数や組込み例外名)、モジ ュール内のグローバルな名前; +関数を呼び出したときのローカルな名前、があります。 +オブジェクトの属性からなる集合もまた、ある意味では名前空間です。 +名前空間について知っておくべき重要なことは、異なった名前空間にある名前の間 には全く関係がないということです; +例えば、二つの別々のモジュールの両方で関数 ``maximize`` +という関数を定義することができ、定義自体は混同されることはありません --- +モジュールのユーザは名前の前にモジュール名をつけなければなりません。 .. % % A \emph{namespace} is a mapping from names to objects. Most .. % % namespaces are currently implemented as Python dictionaries, but @@ -200,10 +212,15 @@ .. % % that an unqualified reference to a name attempts to find the name in .. % % the namespace. -スコープは静的に決定されますが、動的に使用されます。実行中はいつでも、直接 名前空間にアクセス可能な、少なくとも三つの入れ子になったスコープがあります: -最初に検索される最も内側のスコープには、ローカルな名前が入っています; ある いは、最も内側のスコープを囲んでいる関数群のスコープで、最も -近傍のスコープから検索を始めます; 中間のスコープが次に検索され、このスコー プには現在のモジュールのグローバルな名前が入っています; (最後に検索される) -最も外側のスコープは、組み込みの名前が入った名前空間です。 +スコープは静的に決定されますが、動的に使用されます。 +実行中はいつでも、直接名前空間にアクセス可能な、少なくとも三つの入れ子にな ったスコープがあります: +最初に検索される最も内側のスコープには、ローカルな名前が入っています: + +* 最初に探される、最も内側のスコープは、ローカルな名前を持っています。 +* 外側の(enclosing)関数のスコープは、近いほうから順に探され、 + ローカルでもグローバルでもない名前を持っています。 +* 次のスコープは、現在のモジュールのグローバルな名前を持っています。 +* 一番外側の(最後に検索される)スコープはビルトイン名を持っています。 .. % % Although scopes are determined statically, they are used dynamically. .. % % At any time during execution, there are at least three nested scopes whose @@ -214,9 +231,11 @@ .. % % and the outermost scope (searched last) is the namespace containing built-in .. % % names. -名前がグローバルであると宣言されている場合、その名前に対する参照や代入は全 て、モジュールのグローバルな名前の入った中間のスコープに -対して直接行われます。そうでない場合、最も内側のスコープより外側にある変数 は全て読み出し専用(そのような変数に対する書き込みは、単に -*新しい* ローカル変数もっとも内側のスコープで作成し、外部のスコープの値は変 化しません)となります。 +名前がグローバルであると宣言されている場合、その名前に対する参照や代入は全 て、 +モジュールのグローバルな名前の入った中間のスコープに対して直接行われます。 +そうでない場合、最も内側のスコープより外側にある変数は全て読み出し専用 +(そのような変数に対する書き込みは、単に *新しい* ローカル変数もっとも +内側のスコープで作成し、外部のスコープの値は変化しません)となります。 .. % % If a name is declared global, then all references and assignments go .. % % directly to the middle scope containing the module's global names. @@ -247,8 +266,10 @@ .. % % rely on dynamic name resolution! (In fact, local variables are .. % % already determined statically.) -Python 特有の癖として、代入を行うと -- どの :keyword:`global` 文も有効でな い場合は -- 名前がいつも最も内側のスコープに入るというものがあります。代入は データのコピーを行いません --- -単に名前をオブジェクトに結びつける (bind) だけです。オブジェクトの削除でも 同じです: ``del x`` は、 ``x`` +Python 特有の癖として、代入を行うと -- どの :keyword:`global` 文も有効でな い場合は -- +名前がいつも最も内側のスコープに入るというものがあります。 +代入はデータのコピーを行いません --- 単に名前をオブジェクトに結びつける (bind) だけです。 +オブジェクトの削除でも同じです: ``del x`` は、 ``x`` をローカルスコープが参照している名前空間から削除します。実際、新たな名前を 導入する操作は全てローカルスコープを用います: とりわけ、 import 文や関数定義は、モジュールや関数の名前をローカルスコープに結び付けます。 (:keyword:`global` 文を使えば、 特定の変数がグローバルスコープにあることを示せます。) @@ -562,10 +583,9 @@ データ属性ではないインスタンス属性が参照された時は、そのクラスが検索されま す。 その名前が有効なクラス属性を表している関数オブジェクトなら、インスタンスオ ブジェクトと見つかった関数オブジェクト (へのポインタ) を抽象オブジェクト: すなわちメソッドオブジェクトにパック (pack) して作成し ます。 -メソッドオブジェクトは、引数リストを伴って呼び出される際に再度\ -アンパック (unpack) され、新たな引数リストがインスタンスオブジェクト\ -とオリジナルの引数リストから構成され、関数オブジェクトは新たな引数\ -リストを使って呼び出されます。 +メソッドオブジェクトが引数リストと共に呼び出されるとき、インスタンスオブジ ェクトと +渡された引数リストから新しい引数リストを作成して、元の関数オブジェクトを +新しい引数リストで呼び出します。 .. % % If you still don't understand how methods work, a look at the .. % % implementation can perhaps clarify matters. When an instance @@ -635,9 +655,11 @@ .. % % the readability of methods: there is no chance of confusing local .. % % variables and instance variables when glancing through a method. -しばしば、メソッドの最初の引数を、しばしば ``self`` と呼びます。この名前付 けは単なる慣行でしかありません: ``self`` という名前は、 -Python では何ら特殊な意味を持ちません。 (とはいえ、この慣行に従わないと、 コードは他の Python プログラマにとってやや読みにくいものとなります。 -また、 *クラスブラウザ (class browser)* プログラムがこの慣行をあてにして書 かれているかもしれません。) +よく、メソッドの最初の引数を ``self`` と呼びます。 +この名前付けは単なる慣習でしかありません: ``self`` という名前は、 +Python では何ら特殊な意味を持ちません。 +とはいえ、この慣行に従わないと、コードは他の Python プログラマにとってやや 読みにくいものとなります。 +また、 *クラスブラウザ (class browser)* プログラムがこの慣行をあてにして書 かれているかもしれません。 .. % % Often, the first argument of a method is called .. % % \code{self}. This is nothing more than a convention: the name @@ -695,11 +717,14 @@ self.add(x) self.add(x) -メソッドは、通常の関数と同じようにして、グローバルな名前を参照してもかまい ません。あるメソッドに関連付けられたグローバルなスコープは、 -クラス定義の入っているモジュールになります。 (クラス自体はグローバルなス コープとして用いられることはありません!) メソッドでグローバルな -データを使う良い理由はほとんどありませんが、グローバルなスコープを使う合法 的な使い方は多々あります: 一つ挙げると、メソッド内では、グローバルなスコープ に -import された関数やモジュールや、その中で定義された関数やクラスを使うことが できます。通常、メソッドの入っているクラス自体はグローバルなスコープ内で -定義されています。次の章では、メソッドが自分のクラスを参照する理由として正 当なものを見てみましょう! +メソッドは、通常の関数と同じようにしてグローバルな名前を参照します。 +あるメソッドに関連付けられたグローバルなスコープは、クラス定義の入っている モジュールになります。 +(クラス自体はグローバルなスコープとして用いられることはありません。) +メソッドでグローバルなデータを使う良い理由はほとんどありませんが、グローバ ルなスコープを使う合法的な使い方は多々あります: +一つ挙げると、メソッド内では、グローバルなスコープに import された関数やモ ジュールや、 +その中で定義された関数やクラスを使うことができます。 +通常、メソッドの入っているクラス自体はグローバルなスコープ内で定義されてい ます。 +次の章では、メソッドが自分のクラスを参照する理由として正当なものを見てみま しょう。 .. % % Methods may reference global names in the same way as ordinary .. % % functions. The global scope associated with a method is the module @@ -786,8 +811,10 @@ 導出クラスで上書きしているメソッドでは、実際は単に基底クラスの同名のメソッ ドを置き換えるだけではなく、拡張を行いたいかもしれません。 基底クラスのメソッドを直接呼び出す簡単な方法があります: 単に ``BaseClassName.methodname(self, arguments)`` -を呼び出すだけです。この仕様は、場合によってはクライアントでも役に立ちま す。 (この呼び出し方が動作するのは、基底クラスがグローバルなスコープ内で -定義されているか、直接 import されている場合だけなので注意してください。) +を呼び出すだけです。 +この仕様は、場合によってはクライアントでも役に立ちます。 +(この呼び出し方が動作するのは、基底クラスがグローバルスコープの ``BaseClassName`` +という名前で悪えっすされているときだけです。) .. % % An overriding method in a derived class may in fact want to extend .. % % rather than simply replace the base class method of the same name. @@ -798,9 +825,15 @@ Python には継承に関係する 2 つの組み込み関数があります: -* :func:`isinstance` を使うとオブジェクトの型が調べられます: ``isinstance(obj, int)`` は ``obj.__class__`` が :class:`int` や :class:`int` の導出クラスの場合に限り ``True`` になります。 - -* :func:`issubclass` を使うとクラスの継承関係が調べられます: :class:`bool` は :class:`int` のサブクラスなので ``issubclass(bool, int)`` は ``True`` で す。しかし、 :class:`unicode` は :class:`str` のサブクラスではない (単に共通 の祖先 :class:`basestring` を共有している) ので ``issubclass(unicode, str)`` は ``False`` です。 +* :func:`isinstance` を使うとインスタンスの型が調べられます: + ``isinstance(obj, int)`` は ``obj.__class__`` が :class:`int` や + :class:`int` の導出クラスの場合に限り ``True`` になります。 + +* :func:`issubclass` を使うとクラスの継承関係が調べられます: + :class:`bool` は :class:`int` のサブクラスなので ``issubclass(bool, int)`` + は ``True`` です。しかし、 :class:`unicode` は :class:`str` + のサブクラスではない (単に共通の祖先 :class:`basestring` + を共有している) ので ``issubclass(unicode, str)`` は ``False`` です。 .. _tut-multiple: @@ -883,59 +916,31 @@ プライベート変数 ================ -クラスプライベート (class-private) の識別子に関して限定的なサポートがなされ ています。 ``__spam`` (先頭に二個以上の下線文字、末尾に -高々一個の下線文字) という形式の識別子、テキスト上では ``_classname__spam`` へと置換されるようになりました。ここで -``classname`` は、現在のクラス名から先頭の下線文字をはぎとった名前になりま す。このような難号化 (mangle) は、識別子の -文法的な位置にかかわらず行われるので、クラスプライベートなインスタンス変数 やクラス変数、メソッド、グローバル変数、そしてインスタンスに含まれる変数を -定義するために利用できます。また、このクラスにとってプライベートなインスタ ンス変数を *他の* クラスのインスタンスに格納するために -使うことさえできます。難号化した名前が 255 文字より長くなるときは、切り詰め が起こるかもしれません。 -クラスの外側や、クラス名が下線文字だけからできているときには、難号化加工は 起こりません。 - -.. % Private Variables -.. % % There is limited support for class-private -.. % % identifiers. Any identifier of the form \code{__spam} (at least two -.. % % leading underscores, at most one trailing underscore) is now textually -.. % % replaced with \code{_classname__spam}, where \code{classname} is the -.. % % current class name with leading underscore(s) stripped. This mangling -.. % % is done without regard to the syntactic position of the identifier, so -.. % % it can be used to define class-private instance and class variables, -.. % % methods, variables stored in globals, and even variables stored in instances. -.. % % private to this class on instances of \emph{other} classes. Truncation -.. % % may occur when the mangled name would be longer than 255 characters. -.. % % Outside classes, or when the class name consists of only underscores, -.. % % no mangling occurs. - -名前の難号化は、クラスにおいて、 "プライベートな" インスタンス変数やメソッ ドを定義する際に、導出クラスで定義されるインスタンス変数を気に -したり、クラスの外側のコードからインスタンス変数をいじりまわすことがないよ うに簡単に定義できるようにするためのものです。 -難号化の規則は主に不慮の事故を防ぐためのものだということに注意してくださ い; 確信犯的な方法で、プライベートとされている変数にアクセス -したり変更することは依然として可能なのです。デバッガのような特殊な状況で は、この仕様は便利ですらあります。そのため、この抜け穴は塞がれていません。 -(些細なバグ: 基底クラスと同じ名前のクラスを導出すると、基底クラスのプライ ベート変数を使えるようになります。) - -.. % % Name mangling is intended to give classes an easy way to define -.. % % ``private'' instance variables and methods, without having to worry -.. % % about instance variables defined by derived classes, or mucking with -.. % % instance variables by code outside the class. Note that the mangling -.. % % rules are designed mostly to avoid accidents; it still is possible for -.. % % a determined soul to access or modify a variable that is considered -.. % % private. This can even be useful in special circumstances, such as in -.. % % the debugger, and that's one reason why this loophole is not closed. -.. % % (Buglet: derivation of a class with the same name as the base class -.. % % makes use of private variables of the base class possible.) +オブジェクトの中からしかアクセス出来ない "プライベート" インスタンス変数 は、 +Python にはありません。 +しかし、ほとんどの Python コードが従っている慣習があります。 +アンダースコアで始まる名前 (例えば ``_spam``) は、 (関数であれメソッドであ れ +データメンバであれ) 非 public なAPIとして扱います。 +これらは、予告なく変更されるかもしれない実装の詳細として扱われるべきです。 + +クラスのプライベートメンバについて適切なユースケース(特にサブクラスで定義さ れた名前との +衝突を避ける場合)があるので、 マングリング(:dfn:`name mangling`) と呼ばれ る、 +限定されたサポート機構があります。 +``__spam`` (先頭に二個以上の下線文字、末尾に一個以下の下線文字) という形式 の識別子は、 +``_classname__spam`` へとテキスト置換されるようになりました。ここで +``classname`` は、現在のクラス名から先頭の下線文字をはぎとった名前になりま す。 +このような難号化 (mangle) は、識別子の文法的な位置にかかわらず行われるの で、 +クラス定義内に現れた識別子全てに対して実行されます。 + +難号化の規則は主に不慮の事故を防ぐためのものだということに注意してください; +確信犯的な方法で、プライベートとされている変数にアクセスしたり変更すること は依然として可能なのです。 +デバッガのような特殊な状況では、この仕様は便利ですらあります。 ``exec`` や ``eval()`` や ``execfile()`` へ渡されたコードでは、 呼出し元のクラス名を現在のクラスと見なさないことに注意してください; この仕 様は ``global`` 文の効果と似ており、その効果もまた同様に、 バイトコンパイルされたコードに制限されています。同じ制約が ``getattr()`` と ``setattr()`` と ``delattr()`` にも適用されます。また、 ``__dict__`` を直接参照するときにも適用されます。 -.. % % Notice that code passed to \code{exec}, \code{eval()} or -.. % % \code{execfile()} does not consider the classname of the invoking -.. % % class to be the current class; this is similar to the effect of the -.. % % \code{global} statement, the effect of which is likewise restricted to -.. % % code that is byte-compiled together. The same restriction applies to -.. % % \code{getattr()}, \code{setattr()} and \code{delattr()}, as well as -.. % % when referencing \code{__dict__} directly. - - .. _tut-odds: 残りのはしばし @@ -992,15 +997,10 @@ 例外はクラスであってもよい -------------------------- -ユーザ定義の例外をクラスとして識別することもできます。このメカニズムを使っ て、拡張可能な階層化された例外を作成することができます。 - -.. % Exceptions Can Be Classes -.. % % User-defined exceptions are identified by classes as well. Using this -.. % % mechanism it is possible to create extensible hierarchies of exceptions. - -新しく二つの (意味付け的な) 形式の raise 文ができました: - -.. % % There are two new valid (semantic) forms for the raise statement: +ユーザ定義の例外をクラスとして識別することもできます。 +このメカニズムを使って、拡張可能な階層化された例外を作成することができま す。 + +新しく二つの (意味付け的な) 形式の :keyword:`raise` 文ができました。 :: @@ -1008,28 +1008,17 @@ raise instance -第一の形式では、 ``instance`` は :class:`Class` またはその導出クラスのイン スタンスでなければなりません。第二の形式は以下の表記: - -.. % % In the first form, \code{instance} must be an instance of -.. % % \class{Class} or of a class derived from it. The second form is a -.. % % shorthand for: +第一の形式では、 ``instance`` は :class:`Class` またはその導出クラスのイン スタンスでなければなりません。 +第二の形式は以下の表記の短縮された記法です。 :: raise instance.__class__, instance -の短縮された記法です。 - -except 節には、文字列オブジェクトだけでなくクラスを並べることができます。 except 節のクラスは、同じクラスか基底クラスの例外のときに互換 -(compatible) となります (逆方向では成り立ちません --- 導出クラスの例外がリ ストされている except -節は基底クラスの例外と互換ではありません)。例えば、次のコードは、 B, C, D を順序通りに出力します: - -.. % % An except clause may list classes as well as string objects. A class -.. % % in an except clause is compatible with an exception if it is the same -.. % % class or a base class thereof (but not the other way around --- an -.. % % except clause listing a derived class is not compatible with a base -.. % % class). For example, the following code will print B, C, D in that -.. % % order: +:keyword:`except` 節のクラスは、同じクラスか基底クラスの例外のときに互換 (compatible)となります。 +(逆方向では成り立ちません --- 導出クラスの例外がリストされている except +節は基底クラスの例外と互換ではありません)。 +例えば、次のコードは、 B, C, D を順序通りに出力します。 :: @@ -1124,14 +1113,11 @@ it.next() StopIteration -イテレータプロトコルの背後にあるメカニズムを一度目にすれば、自作のクラスに イテレータとしての振る舞いを追加するのは簡単です。 :meth:`__iter__` -メソッドを定義して、 :meth:`next` メソッドを持つオブジェクトを返すようにし てください。クラス自体で :meth:`next` -を定義している場合、 :meth:`__iter__` では単に ``self`` を返すようにできま す: - -.. % % Having seen the mechanics behind the iterator protocol, it is easy to add -.. % % iterator behavior to your classes. Define a \method{__iter__()} method -.. % % which returns an object with a \method{next()} method. If the class defines -.. % % \method{next()}, then \method{__iter__()} can just return \code{self}: +イテレータプロトコルの背後にあるメカニズムを一度目にすれば、 +自作のクラスにイテレータとしての振る舞いを追加するのは簡単です。 +:meth:`__iter__` メソッドを定義して、 :meth:`next` メソッドを持つ +オブジェクトを返すようにしてください。クラス自体で :meth:`next` +を定義している場合、 :meth:`__iter__` では単に ``self`` を返すようにできま す。 :: @@ -1148,7 +1134,10 @@ self.index = self.index - 1 return self.data[self.index] - >>> for char in Reverse('spam'): + >>> rev = Reverse('spam') + >>> iter(rev) + <__main__.Reverse object at 0x00A1DB50> + >>> for char in rev: ... print char ... m @@ -1156,6 +1145,7 @@ p s + .. % % \section{Generators\label{generators}} ======================================= --- /tutorial/diff/classes.rst.diff Fri Jan 28 21:01:22 2011 +++ /tutorial/diff/classes.rst.diff Thu Feb 10 04:41:15 2011 @@ -17,20 +17,22 @@ +name. Objects can contain an arbitrary amount of data. In C++ terminology, all class members (including the data members) are *public*, --and all member functions are *virtual*. There are no special constructors or +-and all member functions are *virtual*. ++and all member functions are *virtual*. +-There are no special constructors or -destructors. As in Modula-3, there are no shorthands for referencing the -object's members from its methods: the method function is declared with an ++As in Modula-3, there are no shorthands ++for referencing the object's members from its methods: the method function is -explicit first argument representing the object, which is provided implicitly by ++declared with an explicit first argument representing the object, which is -the call. As in Smalltalk, classes themselves are objects, albeit in the wider ++provided implicitly by the call. As in Smalltalk, classes themselves are -sense of the word: in Python, all data types are objects. This provides ++objects. This provides semantics for importing and renaming. Unlike C++ and -semantics for importing and renaming. Unlike C++ and Modula-3, built-in types -can be used as base classes for extension by the user. Also, like in C++ but -unlike in Modula-3, most built-in operators with special syntax (arithmetic -+and all member functions are *virtual*. As in Modula-3, there are no shorthands -+for referencing the object's members from its methods: the method function is -+declared with an explicit first argument representing the object, which is -+provided implicitly by the call. As in Smalltalk, classes themselves are -+objects. This provides semantics for importing and renaming. Unlike C++ and +Modula-3, built-in types can be used as base classes for extension by the user. +Also, like in C++, most built-in operators with special syntax (arithmetic operators, subscripting etc.) can be redefined for class instances. @@ -58,15 +60,15 @@ usually not appreciated on a first glance at Python, and can be safely ignored when dealing with immutable basic types (numbers, strings, tuples). However, -aliasing has an (intended!) effect on the semantics of Python code involving ++aliasing has a possibly surprising effect on the semantics of Python code -mutable objects such as lists, dictionaries, and most types representing ++involving mutable objects such as lists, dictionaries, and most other types. -entities outside the program (files, windows, etc.). This is usually used to -the benefit of the program, since aliases behave like pointers in some respects. -For example, passing an object is cheap since only a pointer is passed by the -implementation; and if a function modifies an object passed as an argument, the -caller will see the change --- this eliminates the need for two different -argument passing mechanisms as in Pascal. -+aliasing has a possibly surprising effect on the semantics of Python code -+involving mutable objects such as lists, dictionaries, and most other types. +This is usually used to the benefit of the program, since aliases behave like +pointers in some respects. For example, passing an object is cheap since only a +pointer is passed by the implementation; and if a function modifies an object @@ -172,22 +174,22 @@ already determined statically.) -A special quirk of Python is that -- if no :keyword:`global` --statement is in effect -- assignments to names always go --into the innermost scope. Assignments do not copy data --- they just bind names --to objects. The same is true for deletions: the statement ``del x`` removes the --binding of ``x`` from the namespace referenced by the local scope. In fact, all --operations that introduce new names use the local scope: in particular, import --statements and function definitions bind the module or function name in the --local scope. (The :keyword:`global` statement can be used to indicate that --particular variables live in the global scope.) +A special quirk of Python is that -- if no :keyword:`global` statement is in +-statement is in effect -- assignments to names always go +effect -- assignments to names always go into the innermost scope. Assignments +-into the innermost scope. Assignments do not copy data --- they just bind names +do not copy data --- they just bind names to objects. The same is true for +-to objects. The same is true for deletions: the statement ``del x`` removes the +deletions: the statement ``del x`` removes the binding of ``x`` from the +-binding of ``x`` from the namespace referenced by the local scope. In fact, all +namespace referenced by the local scope. In fact, all operations that introduce +-operations that introduce new names use the local scope: in particular, import +new names use the local scope: in particular, :keyword:`import` statements and +-statements and function definitions bind the module or function name in the +function definitions bind the module or function name in the local scope. (The +-local scope. (The :keyword:`global` statement can be used to indicate that +:keyword:`global` statement can be used to indicate that particular variables +-particular variables live in the global scope.) +live in the global scope.) @@ -215,9 +217,9 @@ (pointers to) the instance object and the function object just found together in an abstract object: this is the method object. When the method object is called -with an argument list, it is unpacked again, a new argument list is constructed ++with an argument list, a new argument list is constructed from the instance -from the instance object and the original argument list, and the function object -is called with this new argument list. -+with an argument list, a new argument list is constructed from the instance +object and the argument list, and the function object is called with this new +argument list. @@ -343,16 +345,32 @@ Private Variables ================= ++"Private" instance variables that cannot be accessed except from inside an ++object, don't exist in Python. However, there is a convention that is followed ++by most Python code: a name prefixed with an underscore (e.g. ``_spam``) should ++be treated as a non-public part of the API (whether it is a function, a method ++or a data member). It should be considered an implementation detail and subject ++to change without notice. ++ ++Since there is a valid use-case for class-private members (namely to avoid name ++clashes of names with names defined by subclasses), there is limited support for -There is limited support for class-private identifiers. Any identifier of the ++such a mechanism, called :dfn:`name mangling`. Any identifier of the form -form ``__spam`` (at least two leading underscores, at most one trailing ++``__spam`` (at least two leading underscores, at most one trailing underscore) -underscore) is textually replaced with ``_classname__spam``, where ``classname`` ++is textually replaced with ``_classname__spam``, where ``classname`` is the -is the current class name with leading underscore(s) stripped. This mangling is ++current class name with leading underscore(s) stripped. This mangling is done -done without regard to the syntactic position of the identifier, so it can be ++without regard to the syntactic position of the identifier, as long as it -used to define class-private instance and class variables, methods, variables ++occurs within the definition of a class. -stored in globals, and even variables stored in instances. private to this class -on instances of *other* classes. Truncation may occur when the mangled name -would be longer than 255 characters. Outside classes, or when the class name -consists of only underscores, no mangling occurs. ++ - -Name mangling is intended to give classes an easy way to define "private" -instance variables and methods, without having to worry about instance variables @@ -363,22 +381,6 @@ -as in the debugger, and that's one reason why this loophole is not closed. -(Buglet: derivation of a class with the same name as the base class makes use of -private variables of the base class possible.) -+"Private" instance variables that cannot be accessed except from inside an -+object, don't exist in Python. However, there is a convention that is followed -+by most Python code: a name prefixed with an underscore (e.g. ``_spam``) should -+be treated as a non-public part of the API (whether it is a function, a method -+or a data member). It should be considered an implementation detail and subject -+to change without notice. -+ -+Since there is a valid use-case for class-private members (namely to avoid name -+clashes of names with names defined by subclasses), there is limited support for -+such a mechanism, called :dfn:`name mangling`. Any identifier of the form -+``__spam`` (at least two leading underscores, at most one trailing underscore) -+is textually replaced with ``_classname__spam``, where ``classname`` is the -+current class name with leading underscore(s) stripped. This mangling is done -+without regard to the syntactic position of the identifier, as long as it -+occurs within the definition of a class. -+ +Note that the mangling rules are designed mostly to avoid accidents; it still is +possible to access or modify a variable that is considered private. This can +even be useful in special circumstances, such as in the debugger. @@ -420,11 +422,11 @@ raise instance.__class__, instance -A class in an except clause is compatible with an exception if it is the same ++A class in an :keyword:`except` clause is compatible with an exception if it is -class or a base class thereof (but not the other way around --- an except clause ++the same class or a base class thereof (but not the other way around --- an -listing a derived class is not compatible with a base class). For example, the -following code will print B, C, D in that order:: -+A class in an :keyword:`except` clause is compatible with an exception if it is -+the same class or a base class thereof (but not the other way around --- an +except clause listing a derived class is not compatible with a base class). For +example, the following code will print B, C, D in that order::