📜  Python中的类方法与静态方法

📅  最后修改于: 2020-01-18 14:58:46             🧑  作者: Mango

类方法

@classmethod装饰器是一个内置的函数装饰器,它是一个表达式,在定义函数后会对其求值。求值的结果使您的函数定义变得模糊。
类方法将类作为隐式第一个参数接收,就像实例方法接收实例
语法 :

class C(object):
    @classmethod
    def fun(cls, arg1, arg2, ...):
       ....
fun: 需要被转化成类方法的函数
returns: 类方法.
  • 类方法是绑定到类而不是类对象的方法。
  • 他们可以访问类的状态,因为它需要一个指向该类而不是对象实例的类参数。
  • 它可以修改适用于该类所有实例的类状态。例如,它可以修改将适用于所有实例的类变量。

静态方法

静态方法不会收到隐式的第一个参数。
语法:

class C(object):
    @staticmethod
    def fun(arg1, arg2, ...):
        ...
returns: 一个静态方法
  • 静态方法也是绑定到类而不是类的对象的方法。
  • 静态方法无法访问或修改类状态。
  • 它存在于类中是因为静态方法存在于类中是有意义的。

类方法与静态方法

  • 类方法将cls作为第一个参数,而静态方法则不需要特定的参数。
  • 类方法可以访问或修改类状态,而静态方法不能访问或修改它。
  • 通常,静态方法对类状态一无所知。它们是使用一些参数并在这些参数上起作用的实用程序类型方法。
  • 我们在Python中使用@classmethod装饰器创建类方法,并在Python中使用@staticmethod装饰器创建静态方法。

什么时候使用什么?

  • 我们通常使用类方法来创建工厂方法。工厂方法针对不同的用例返回类对象(类似于构造函数)。
  • 我们通常使用静态方法来创建实用程序函数。

如何定义一个类方法和一个静态方法?

要在Python中定义类方法,我们使用@classmethod装饰器。若要定义静态方法,我们使用@staticmethod装饰器。
让我们看一个例子,以了解它们之间的区别。假设我们要创建一个类Person。现在,Python不支持C++或Java之类的方法重载,因此我们使用类方法创建工厂方法。在下面的示例中,我们使用类方法从出生年份创建一个人员对象。
如上所述,我们使用静态方法来创建实用程序函数。在下面的示例中,我们使用静态方法来检查一个人是否成年。
例子:

# Python程序,展示类方法和静态方法
from datetime import date
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    # a class method to create a Person object by birth year.
    @classmethod
    def fromBirthYear(cls, name, year):
        return cls(name, date.today().year - year)
    # 静态方法
    @staticmethod
    def isAdult(age):
        return age > 18
person1 = Person('logan', 21)
person2 = Person.fromBirthYear('logan', 1996)
print person1.age
print person2.age
# print the result
print Person.isAdult(22)

输出: 

21
21
True