Pythonのクラスメンバー関数、静的関数、メンバーの関数の比較

4318 ワード

宣言方式から見ると、一般メンバー関数は最も一般的な方法である.
class Foo:
    def plain_func():
    	pass

クラスメンバー関数は
class Foo:
	@classmethod
	def class_func():
		pass

静的関数は
class Foo:
	@staticmethod
	def static_func():
		pass

呼び出し方式から見ると、一般関数と後者の違いが大きく、一般関数はクラスのインスタンスでのみ呼び出され、その後、両者はクラス名で呼び出されます.
class Foo:
    def plain_func(self):
        print("plain_func")

    @classmethod
    def class_func(cls):
        print("class_func")

    @staticmethod
    def static_func():
        print("static_func")


#          
foo = Foo()
foo.plain_func()
#         
Foo.class_func()
Foo.static_func()

その後、クラスメソッドと静的メソッドの最も核心的な違いは、クラスメソッドにはclsパラメータがあり、静的メソッドにはclsパラメータがないことである.clsは、クラスインスタンスを参照するthisポインタとして理解される.
この回答からクラスメソッドについてのまとめ:
  • メソッドは、自分がベースクラスによって呼び出すか、またはあるサブクラスによって呼び出されるかを判断することができる
  • .
  • がサブクラスによって呼び出されると、メソッドは、ベースクラスのインスタンスではなくサブクラスのインスタンス
  • を返すことができる.
  • がサブクラスによって呼び出されると、メソッドはサブクラスの他のclassmethod
  • を呼び出すことができる.
    一般的にclassmethodはstaticmethodに完全に代わることができる.staticmethodの唯一の利点は、呼び出し時に真の関数を返し、呼び出すたびに同じインスタンスを返すことです(classmethodはベースクラスとサブクラスに対して異なるbound methodインスタンスを返します)が、これはほとんど役に立たないことです.ただし、staticmethodはサブクラスでclassmethodと書き換えることができ、逆も同様であるため、staticmethodをすべてclassmethodに変更して必要に応じて使用する必要はありません.
    作者:霊剣リンク:https://www.zhihu.com/question/20021164/answer/537385841出典:著作権は作者の所有であることを知っている.商業転載は著者に連絡して許可を得てください.非商業転載は出典を明記してください.