[解決済み] クラスメソッドとインスタンスメソッドの違い
質問
私が読んでいたのは 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'>
関連
-
[解決済み] staticmethodとclassmethodの違いについて
-
[解決済み] Pythonのリストメソッドであるappendとextendの違いは何ですか?
-
[解決済み] Pythonの静的メソッド?
-
[解決済み] インスタンスのクラス名を取得する?
-
[解決済み] 最近のPythonでカスタム例外を宣言する適切な方法?
-
[解決済み] リストにおけるdel、remove、popの違いについて
-
[解決済み] リストとタプルの違いは何ですか?
-
[解決済み】__str__と__repr__の違いは何ですか?
-
[解決済み】venv, pyvenv, pyenv, virtualenv, virtualenvwrapper, pipenvなどの違いは何ですか?
-
[解決済み] matplotlib でプロットの軸、目盛、ラベルの色を変更する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] PythonでのAWS Lambdaのインポートモジュールエラー
-
[解決済み] Flaskで1時間ごとに関数を実行するようにスケジュールするには?
-
[解決済み] 辞書のキーと値を交換するにはどうすればよいですか?
-
[解決済み] dict を txt ファイルに書き、それを読み取る?
-
[解決済み] SQLAlchemy: 日付フィールドをフィルタリングする方法は?
-
[解決済み] 文字列から先頭と末尾のスペースを削除するには?
-
[解決済み] 値で列挙名を取得する [重複]。
-
[解決済み] djangoフレームワークでフォームフィールドから値を取得するには?
-
[解決済み] matplotlib でプロットの軸、目盛、ラベルの色を変更する方法
-
[解決済み] Celeryタスクのユニットテストはどのように行うのですか?