Pythonにおけるstaticmethodとclassmethodの役割と違い


一般的には、ある種類の方法を使うには、まずオブジェクトを具体化してから呼び出す方法が必要です。
@staticmethodまたは@classimethodを使うと、実例化せずに直接類名.メソッド名()を呼び出すことができます。
これはコードを組織するのに役立ちます。ある種類の関数をその種類に入れます。名前空間の綺麗さにもいいです。
@staticmethodと@classimethodは直接類名できます。方法名()を呼びますが、何の違いがありますか?
それらの使用から見て
  • @staticmethodは、自身のオブジェクトを表すselfと自身のクラスのclsパラメータを必要とせず、使用関数と同じです。
  • @classmethodもselfパラメータを必要としないが、最初のパラメータは自分のクラスを表すclsパラメータである必要がある。
  • @staticmethodでこのクラスのいくつかの属性方法を呼び出すなら、直接類名.属性名または類名.方法名のみです。
    また、@classimethodはclsパラメータを持っているので、クラスの属性、クラスの方法、オブジェクトの実例などを呼び出して、ハードコードを避けることができます。
    具体的な方法、静的な方法、および種類の方法は何かを理解したい。
    
    class Demo(object):
     def instance_method(self, your_para):
     """
     this is an instance_method
     you should call it like the follow:
     a = Demo()
     a.instance_method(your_para)
     plus: in python, we denote 'cls' as latent para of Class
     while 'self' as latent para of the instance of the Class
     :param your_para: 
     :return: 
     """
     print("call instance_method and get:", your_para)
     @classmethod
     def class_method(cls, your_para):
     """
     this is a class_method
     you can call it like the follow:
     method1:
     a = Demo()
     a.class_method(your_para)
     method2:
     Demo.class_method
     plus: in python, we denote 'cls' as latent para of Class
     while 'self' as latent para of the instance of the Class
     :param your_para: 
     :return: 
     """
     print("call class_method and get:", your_para)
     @staticmethod
     def static_method(your_para):
     """
     this is a static_method and you can call it like the 
     methods of class_method
     :param your_para: 
     :return: 
     """
     print("call static_method and get:", your_para)
    クラス方法はコール時にCsを明示的に宣言しなかったが、クラス自体は暗黙のパラメータとして導入された。これは、例示的な方法のように、起動時にも明示的にSElfを宣言していないが、実際の例自体は暗黙のパラメータとして伝わってくる。
    静的関数については,一般的にクラスに関係なく,実例に関係ない関数を静的関数として定義した。例えば入り口検査の関数は静的関数として定義したほうがいいです。
    クラス方法の妙味は、継承における役割:
    
    class Fruit(object):
     total = 0 #        
     @classmethod
     def print_total(cls):
     print('this is the ', cls, '.total:', cls.total, ' and its id: ', id(cls.total)) # cls    ,     total  
     print('this is the Fruit.total:', Fruit.total, 'and its id: ', id(Fruit.total))
     print("=======================")
     @classmethod
     def set(cls, value):
     cls.total = value
    class Apple(Fruit):
     pass
    class Orange(Fruit):
     pass
    app1 = Apple()
    app1.set(10)
    app1.print_total()
    Apple.print_total()
    Fruit.set(2)
    app1.print_total()
    Fruit.print_total()
    """
    output:
    this is the <class '__main__.Apple'> .total: 10 and its id: 1355201264
    this is the Fruit.total: 0 and its id: 1355200944
    =======================
    this is the <class '__main__.Apple'> .total: 10 and its id: 1355201264
    this is the Fruit.total: 0 and its id: 1355200944
    =======================
    this is the <class '__main__.Apple'> .total: 10 and its id: 1355201264
    this is the Fruit.total: 2 and its id: 1355201008
    =======================
    this is the <class '__main__.Fruit'> .total: 2 and its id: 1355201008
    this is the Fruit.total: 2 and its id: 1355201008
    =======================
    """
    
    
    締め括りをつける
    以上はこの文章の全部の内容です。本文の内容は皆さんの学習や仕事に対して一定の参考学習価値を持ってほしいです。ありがとうございます。もっと知りたいなら、下のリンクを見てください。