Pythonクラスで使用される「cls」変数は何ですか?


270

なぜPythonクラスの引数のcls代わりに使用されるのselfですか?

例えば:

class Person:
    def __init__(self, firstname, lastname):
        self.firstname = firstname
        self.lastname = lastname

    @classmethod
    def from_fullname(cls, fullname):
        cls.firstname, cls.lastname = fullname.split(' ', 1)

回答:


293

区別"self"とが"cls"で定義されていますPEP 8。エイドリアンが言ったように、これは必須ではありません。それはコーディングスタイルです。PEP 8言う:

関数とメソッドの引数

selfインスタンスメソッドの最初の引数には常に使用します。

clsクラスメソッドの最初の引数には常に使用します。


56

クラスメソッドの場合に使用します。詳細については、このリファレンスを確認しください。

編集:エイドリアンによって明らかにされたように、それは慣習です。実際には何でも使用できますがclsself使用されています(PEP8)。


52

clsメソッドはクラスに属していることを意味しますが、自己はメソッドがクラスのインスタンスに関連していることを意味します。したがって、を持つメンバーclsはクラス名によってアクセスされますが、自己を持つものはクラスのインスタンスによってアクセスされます...同じ概念ですようstatic membernon-static membersJavaでは、Javaの背景からしている場合。


1
Javaリファレンスをありがとうございます。
エデンショウ

あなたより言及のためにstatic membernon-static members、C ++の文脈でそれを理解
アミットJS

18

これは非常に良い質問ですが、質問ほど必要ではありません。「自己」と「cls」の使用方法には違いがありますが、同じように同じ場所にあります

def moon(self, moon_name):
    self.MName = moon_name

#but here cls method its use is different 

@classmethod
def moon(cls, moon_name):
    instance = cls()
    instance.MName = moon_name

これで両方がmoon関数であることがわかりますが、1つはクラス内で使用でき、他の関数名moonは任意のクラスで使用できます。

実用的なプログラミングアプローチの場合:

サークルクラスを設計する際、エリアのメソッドをclsとして使用します。これは、エリアを特定のクラスのサークルのみに限定したくないためです。


何かを追加したい場合は、コーダーが探しているものが正しい場合はそれを承認します。
TheExorcist

2

クラスメソッドは、selfパラメーターを受け入れる代わりに、メソッドが呼び出されたときに、オブジェクトインスタンスではなく、クラスを指すclsパラメーターを取ります。クラスメソッドはこのcls引数にのみアクセスできるため、オブジェクトインスタンスの状態を変更することはできません。それは自分へのアクセスを必要とするでしょう。ただし、クラスメソッドは、クラスのすべてのインスタンスに適用されるクラスの状態を変更できます。

- Pythonのトリック

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.