代码之家  ›  专栏  ›  技术社区  ›  Francisco

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

  •  1
  • Francisco  · 技术社区  · 6 年前

    我从来没有使用过@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>
    

    但是为什么不这样做呢?

    class Example:
        def __init__(self,param1,param2):
            self.param1 = param1
            self.param2 = param2
    
        def my_method(self,param1,param2):
            return Example(param1,param2)
    
    example = Example(1,2)
    method = example.my_method(3,4)
    print(method)
    

    输出:

    <_ 0x02EC57D0>处的主对象示例
    

    这是相同的结果,但当我可以使用ClassMethod时,我没有想到

    1 回复  |  直到 6 年前
        1
  •  1
  •   Navy Cheng    6 年前

    在python中有3种方法:

    • 实例方法
    • 类方法
    • 静态法
    class Person():
        species='homo_sapiens' # This is class variable
        def __init__(self, name, age):
            self.name = name # This is instance variable
            self.age = age
    
        def show(self):
            print('Name: {}, age: {}.'.format(self.name, date.today().year - self.age))
    
        @classmethod
        def create_with_birth_year(cls, name, birth_year):
            return cls(name, date.today().year - birth_year)
    
        @classmethod
        def print_species(cls):
            print('species: {}'.format(cls.species))
    
        @staticmethod
        def get_birth_year(age):
            return date.today().year - age
    
    
    class Teacher(Person):
        pass
    
    

    1)实例方法( 显示 )需要实例,必须使用 自己 作为第一个参数。它可以通过 自己 影响一个实例的状态。

    2)分类法( 用出生年份创建 版画种 )无需实例和使用 CLS 访问类并影响类的状态。我们可以使用 @类方法 制造工厂,如:

    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)静态法( 吉特诞辰年 )无需特殊参数( 自己 CLS )并将更改类或实例的任何状态。它可以对类的一些助手函数进行私有化。

    推荐文章