1. ホーム
  2. python

[解決済み] クラスメソッドとインスタンスメソッドの違い

2023-06-22 11:48:40

質問

私が読んでいたのは PEP 8 ( スタイルガイド ) を見ていて気づいたのですが、その中で 自己 をインスタンスメソッドの第一引数として使うことを提案していることに気づきました。 cls をクラスメソッドの第一引数として使用します。

私はいくつかのクラスを使って書いてきましたが、クラスメソッドに出会ったことはありません。 cls をパラメータとして渡すメソッド)に出会ったことがありません。何か例があるのでしょうか?

どのように解決するのですか?

インスタンスメソッド

インスタンスメソッドを作成する場合、最初のパラメータは常に self . 好きな名前をつけることができますが、意味は常に同じで、その場合は self という命名規則があるので self はインスタンスメソッドを呼び出すときに (通常) 隠して渡されます。

というクラスの例です。 Inst というインスタンスメソッドを持っている introduce() :

class Inst:

    def __init__(self, name):
        self.name = name

    def introduce(self):
        print("Hello, I am %s, and my name is " %(self, self.name))

さて、このメソッドを呼び出すには、まずクラスのインスタンスを作成する必要があります。 インスタンスを作成したら introduce() を呼び出すと、そのインスタンスは自動的に self :

myinst = Inst("Test Instance")
otherinst = Inst("An other instance")
myinst.introduce()
# outputs: Hello, I am <Inst object at x>, and my name is Test Instance
otherinst.introduce()
# outputs: Hello, I am <Inst object at y>, and my name is An other instance

見ての通り、パラメータである self . これはピリオド演算子で隠された形で渡されます。私たちは Inst クラスのインスタンスメソッド introduce のパラメータで myinst または otherinst . これはつまり Inst.introduce(myinst) を呼び出すと、全く同じ結果が得られるということです。


クラスメソッド

クラスメソッドの考え方はインスタンスメソッドと非常に似ていますが、唯一の違いは、最初のパラメータとしてインスタンスを隠して渡す代わりに、クラス自体を最初のパラメータとして渡すということです。

class Cls:

    @classmethod
    def introduce(cls):
        print("Hello, I am %s!" %cls)

メソッドにクラスだけを渡しているので、インスタンスは関係ありません。

つまり、インスタンスは全く必要なく、クラスメソッドを静的関数であるかのように呼び出しています。

 Cls.introduce() # same as Cls.introduce(Cls)
 # outputs: Hello, I am <class 'Cls'>

また Cls は隠蔽されて渡されるので、次のように言うこともできます。 Cls.introduce(Inst) と言って、出力 "Hello, I am <class 'Inst'> .

これは特に、クラスを Cls :

class SubCls(Cls):
    pass

SubCls.introduce()
# outputs: Hello, I am <class 'SubCls'>