web-dev-qa-db-ja.com

__init__と引数Python

Pythonのコンストラクタ___init___の引数を理解したい。

_class Num:
    def __init__(self,num):
        self.n = num
    def getn(self):
        return self.n
    def getone():
        return 1
myObj = Num(3)

print myObj.getn()
_

結果:3

getone()メソッドを呼び出します:

_print myObj.getone()
_

結果:エラー 'getone()'は引数を取りません(1を指定)。

だから私は置き換えます:

_def getone():
    return 1
_

_def getone(self):
    return 1
_

結果:1これで問題ありません。

ただし、getone()メソッドには引数は必要ありません。

意味のない引数を使用する必要がありますか?

32
Yugo Kamo

Pythonの場合:

  • インスタンスメソッド:self引数が必要です。
  • クラスメソッド:クラスを最初の引数として受け取ります。
  • 静的メソッド:インスタンス(self)またはクラス(cls)引数のいずれも必要としません。

__init__は特別な関数であり、__new__常に最初の引数としてクラスのインスタンスが与えられます。

組み込みのclassmethodおよびstaticmethodデコレータを使用した例:

import sys

class Num:
    max = sys.maxint

    def __init__(self,num):
        self.n = num

    def getn(self):
        return self.n

    @staticmethod
    def getone():
        return 1

    @classmethod
    def getmax(cls):
        return cls.max

myObj = Num(3)
# with the appropriate decorator these should work fine
myObj.getone()
myObj.getmax()
myObj.getn()

そうは言っても、@classmethod/@staticmethod控えめに。 staticmethodsのみで構成されるオブジェクトを作成していることに気付いた場合は、関連する関数の新しいモジュールを作成するのがよりPython的なことです。

43
stderr

すべてのメソッドは、1つの引数(インスタンス自体(または静的メソッドの場合はクラス))を受け入れる必要があります。

Pythonのクラスの詳細を読む

6
Felix Kling

メソッドがseself引数(メソッドがアタッチされているインスタンスへの参照)ではないという事実は、それを省略できるという意味ではありません。 Pythonは常にそれを渡そうとするため、常にそこにある必要があります。

4
kindall

pythonでは、少なくとも1つの引数をクラスメソッドに常に渡す必要があります。引数はselfであり、インスタンス自体への参照では無意味ではありません

2
Jordan

現在のオブジェクトは、最初のパラメーターとしてメソッドに明示的に渡されます。 selfは従来の名前です。任意の名前を付けることができますが、混乱を避けるためにこの規則を守ることを強くお勧めします。

2
neil