Maison  >  Questions et réponses  >  le corps du texte

python 类方法的使用场景

python的类方法的定义和使用都了解, 问题是什么情况下会使用python类方法,而不是普通方法或静态方法?

大家讲道理大家讲道理2741 Il y a quelques jours929

répondre à tous(2)je répondrai

  • 黄舟

    黄舟2017-04-18 09:43:46

    L'exemple auquel je peux penser est que les méthodes de classe sont souvent utilisées en remplacement des constructeurs (__init__).

    Voici un exemple simple :

    class Calculator:
    
        def __init__(self, *numbers):
            self.numbers = numbers
    
        def sum(self):
            return sum(self.numbers)
    
        def avg(self):
            return sum(self.numbers)/len(self.numbers)
    
    if __name__ == '__main__':
        c = Calculator(1,2,3,4,5)
        print(c.sum())
        print(c.avg())    

    C'est une classe de calculatrice complètement inutile, mais ne nous en inquiétons pas trop. Le constructeur de cette classe utilise l'expression en étoile pour remplir la fonction de réception d'un nombre quelconque d'arguments de position. Que dois-je faire si je veux construire cette classe à partir d'une séquence (Liste ou Tuple) ?

    En fait, utilisez simplement l'expression étoile :

        numbers = [6,7,8,9,10]
        c2 = Calculator(*numbers)
        print(c2.sum())
        print(c2.avg())

    Mais la méthode de classe est une autre option en ce moment :

    class Calculator:
    
        def __init__(self, *numbers):
            self.numbers = numbers
    
        def sum(self):
            return sum(self.numbers)
    
        def avg(self):
            return sum(self.numbers)/len(self.numbers)
    
        @classmethod
        def fromseq(cls, seq):
            return cls(*seq)
    
    if __name__ == '__main__':
        numbers = [6,7,8,9,10]
        c3 = Calculator.fromseq(numbers)
        print(c3.sum())
        print(c3.avg())

    Nous pouvons facilement utiliser classmethod pour implémenter des remplacements de constructeurs. La raison principale est que le premier paramètre de classmethod reçoit un objet de classe, ce qui nous permet de traiter les arguments transmis par classmethod dans les constructeurs standard. Reçoit l'entrée et crée des objets à l'aide de la classe. objets et les renvoie.

    Si cette question est confiée à la méthode d'instance, il y aura une méthode de conversion supplémentaire utilisant type(self). L'utilisation de la méthode statique nécessite de coder en dur le nom de la classe dans la méthode, ce qui n'est pas si approprié :

    .
    class Calculator:
        ...(略)...
        
        @classmethod
        def fromseq(cls, seq):
            return cls(*seq)
        
        def fromseq2(self, seq):
            return type(self)(*seq) # 多一個步驟
            
        @staticmethod
        def fromseq3(seq):
            return Calculator(*seq) # 哪一天這個類改名字了這裡也要改...

    Si vous souhaitez en savoir plus sur la méthode d'instance, la méthode de classe et la méthode statique, vous pouvez vous référer à :

    • Dans quelles circonstances la méthode statique de Python doit-elle être utilisée ?

    • Le guide définitif sur la façon d'utiliser les méthodes statiques, de classe ou abstraites en Python


    Questions auxquelles j'ai répondu : Python-QA

    répondre
    0
  • 阿神

    阿神2017-04-18 09:43:46

    Attendez une minute et écrivez un exemple~


    python3

    class 类方法演示(object):
    
        类变量 = '哈哈'
    
        def __init__(实例):
            实例.实例变量 = '实例值'
    
        def 测试1(实例): #实例方法
            print('测试1')
            print(实例)
    
        @classmethod #类方法
        def 测试2(此类): # 此类 就是 类方法演示 自身
            print(此类)
            print('测试2')
            print(类方法演示.类变量)
            print('----------------')
    
        @staticmethod #静态方法
        def 测试3(): # 这里可以不传递参数。
            print(类方法演示.类变量)
            print('测试3')
    
    if __name__ == '__main__':
        对象 = 类方法演示()
        对象.测试1()
        对象.测试2()
        对象.测试3()
        类方法演示.测试3()
    

    类方法 et 静态方法 peuvent accéder au de 类变量, mais pas à 实例变量.
    静态变量, il semble que 闭包 ne peut être réalisé que via 静态变量 en python.

    répondre
    0
  • Annulerrépondre