【问题标题】:what is the use and when to use @classmethod in python?在 python 中使用@classmethod 的用途和时间是什么?
【发布时间】:2019-06-13 07:33:00
【问题描述】:

我从未使用过@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)

输出:

<__main__.Example object at 0x02EC57D0>

结果是一样的,但不知道什么时候可以使用 classmethod

【问题讨论】:

  • 现在想象你从这个类继承。您将始终获得一个 Example 实例,而不是您的子类中的实例。
  • 您的示例是类方法(构造函数)的经典用法。使用这些而不是常规方法的原因是您不必初始化实例即可使用它们。想象一下你的班级'__init__ 做了一些诸如打开网络连接或消耗某种资源之类的事情;您不想创建一个实例只是为了创建其他实例。您可以直接调用 Example.my_method() 而无需任何实际的 Example 实例。这个问题也可能有帮助stackoverflow.com/questions/38238/…

标签: python decorator python-decorators


【解决方案1】:

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) 实例方法(show)需要一个实例,并且必须使用self作为第一个参数。它可以通过self访问实例并影响实例的状态。

2) 类方法(create_with_birth_yearprint_species)不需要实例,使用 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) 不需要特殊参数(selfcls) 并且会改变类或实例的任何状态.它可以提供一些关于类的辅助函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-08
    • 2011-03-08
    • 1970-01-01
    • 2016-07-05
    • 2021-02-06
    • 1970-01-01
    • 2018-11-05
    • 1970-01-01
    相关资源
    最近更新 更多