在python中使用@classmethod的用途和时间是什么?

在python中使用@classmethod的用途和时间是什么?,python,decorator,python-decorators,Python,Decorator,Python Decorators,我从来没有使用过@classmethod,也没有想到过任何使用它的例子,我知道它是如何工作的,但我不知道什么时候可以使用它 class Example: def __init__(self,param1,param2): self.param1 = param1 self.param2 = param2 @classmethod def my_method(cls,param1,param2): return cls(par

我从来没有使用过@classmethod,也没有想到过任何使用它的例子,我知道它是如何工作的,但我不知道什么时候可以使用它

class Example:
    def __init__(self,param1,param2):
        self.param1 = param1
        self.param2 = param2
    @classmethod
    def my_method(cls,param1,param2):
        return cls(param1,param2)

example = Example.my_method(1,2)
print(example)
输出:

<__main__.Example object at 0x02EC57D0>
<__main__.Example object at 0x02EC57D0>
输出:

<__main__.Example object at 0x02EC57D0>
<__main__.Example object at 0x02EC57D0>


这是相同的结果,但我不记得何时可以使用classmethod,python中有3种方法:

  • 实例方法
  • 类方法
  • 静态法
1) 实例方法(show)需要一个实例,并且必须使用self作为第一个参数。它可以通过自身访问实例,并影响实例的状态

2) 类方法(创建带有出生年份和打印种类的类)不需要实例,使用cls访问类并影响类的状态。我们可以使用@classmethod创建工厂,例如:

navy = Person.create_with_birth_year('Navy Cheng', 1989)
navy.show()
此工厂可以继承

zhang = Teacher.create_with_birth_year('zhang', 1980)
print(type(zhang))
和类方法可用于访问类变量:

Person.print_species()

3) 静态方法(get_birth_year)不需要特殊参数(self或cls),并且将更改类或实例的任何状态。它可以为一个类提供一些帮助函数。

现在想象一下,您继承了这个类。您总是会得到一个
示例
实例,而不是子类中的实例。您的示例是classmethods(构造函数)的经典用法。使用这些方法而不是常规方法的原因是,使用它们不必初始化实例。想象一下,你的类'
\uuuuu init\uuuuu
做了类似于打开网络连接或消耗某种资源的事情;您不会只想创建一个实例来创建其他实例。您可以只调用
Example.my_method()
,而不需要任何实际的示例。此外,这个问题可能会有所帮助