web-dev-qa-db-ja.com

クラスメソッドの最初の引数として常にselfを追加するのはなぜですか?

重複の可能性:
なぜPythonメソッドに「self」引数を明示的に含める必要があるのですか?

なぜselfが常にクラスメソッドの最初の引数であるのか理解しています。これは完全に理にかなっていますが、常にそうである場合は、すべてのメソッド定義に対して入力の手間がかかるのはなぜですか。 ?舞台裏で自動的に行われるものにしてみませんか?

それは明確にするためですか、それとも最初の議論として自己を渡したくない状況がありますか?

23
jonathan topf

明示的は暗黙的よりも優れているからです。パラメータを明示的な要件にすることで、コードの理解、内省、および操作を簡素化できます。 Python FAQ でさらに拡張されています。

さらに、クラスメソッドを定義でき(インスタンスの代わりにクラスを最初の引数として使用)、静的メソッドを定義できます(「最初の」引数をまったく使用しないでください)。

class Foo(object):
    def aninstancemethod(self):
        pass

    @classmethod
    def aclassmethod(cls):
        pass

    @staticmethod
    def astaticmethod():
        pass
34
Martijn Pieters

Guidoは ここ と説明しました。基本的に、メソッドは関数であり、関数は「隠された」パラメーターを受け入れるべきではありません。そうしないと、デコレーターなどの高階関数がそれらを適切な方法で処理できなくなります。

15
georg