213

Python でクラスのメソッドを定義すると、次のようになります。

class MyClass(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y

ただし、C# などの他の一部の言語では、メソッド プロトタイプで引数として宣言せずに、"this" キーワードを使用してメソッドがバインドされているオブジェクトへの参照があります。

これは Python での意図的な言語設計上の決定でしたか、それとも引数として「自己」を渡す必要がある実装の詳細がありますか?

4

10 に答える 10

95

PetersのPythonのZenを引用するのが好きです。「暗黙的よりも明示的の方が優れています。」

JavaおよびC++では、this.推測を不可能にする変数名がある場合を除いて、''を推測できます。したがって、必要な場合と不要な場合があります。

Pythonは、ルールに基づくのではなく、このようなことを明示的にすることを選択します。

さらに、何も暗示または想定されていないため、実装の一部が公開されています。 self.__class__self.__dict__およびその他の「内部」構造は、明白な方法で利用できます。

于 2008-09-16T00:47:55.133 に答える
69

メソッドと関数の違いを最小限に抑えることです。これにより、メタクラスでメソッドを簡単に生成したり、実行時に既存のクラスにメソッドを追加したりできます。

例えば

>>> class C:
...     def foo(self):
...         print("Hi!")
...
>>>
>>> def bar(self):
...     print("Bork bork bork!")
...
>>>
>>> c = C()
>>> C.bar = bar
>>> c.bar()
Bork bork bork!
>>> c.foo()
Hi!
>>>

また、(私が知る限り)Pythonランタイムの実装が簡単になります。

于 2008-09-16T00:47:18.487 に答える
57

このトピックに関するGuido van Rossum のブログを読むことをお勧めします - Why explicit self has to stay .

メソッド定義がデコレートされるとき、自動的に「self」パラメーターを与えるかどうかはわかりません。デコレーターは、関数を静的メソッド (「self」を持たない) またはクラス メソッド (インスタンスの代わりにクラスを参照する面白い種類の自己を持っている)、またはまったく異なることを行うことができます (純粋な Python で '@classmethod' または '@staticmethod' を実装するデコレータを書くのは簡単です)。定義されているメソッドに暗黙の「自己」引数を付与するかどうかにかかわらず、デコレーターが何をするかを知らずに方法はありません。

'@classmethod' や '@staticmethod' などの特別なケースのハックは拒否します。

于 2008-11-21T06:28:26.760 に答える
16

Python は、「self」の使用を強制しません。任意の名前を付けることができます。メソッド定義ヘッダーの最初の引数はオブジェクトへの参照であることを覚えておいてください。

于 2008-09-16T01:15:16.377 に答える
4

PEP 227 と関係があると思います:

クラス スコープ内の名前にはアクセスできません。名前は、最も内側の関数スコープで解決されます。クラス定義がネストされたスコープのチェーンで発生する場合、解決プロセスはクラス定義をスキップします。このルールは、クラス属性とローカル変数アクセスの間の奇妙な相互作用を防ぎます。クラス定義で名前バインディング操作が発生すると、結果のクラス オブジェクトに属性が作成されます。メソッド内、またはメソッド内にネストされた関数内でこの変数にアクセスするには、自己またはクラス名を介して属性参照を使用する必要があります。

于 2015-03-31T13:29:09.163 に答える
-5

別の非常に単純な答えもあります。Pythonの禅によると、「暗黙的よりも明示的の方が優れています」。

于 2008-09-16T00:49:26.970 に答える