📜  Python的类方法与静态方法

📅  最后修改于: 2021-09-12 11:04:34             🧑  作者: Mango

类方法

@classmethod 装饰器是一个内置的函数装饰器,它是一个在定义函数后计算的表达式。该评估的结果会影响您的函数定义。
类方法接收类作为隐式第一个参数,就像实例方法接收实例一样
句法:

class C(object):
    @classmethod
    def fun(cls, arg1, arg2, ...):
       ....
fun: function that needs to be converted into a class method
returns: a class method for function.
  • 类方法是绑定到类而不是类的对象的方法。
  • 他们可以访问类的状态,因为它需要一个指向类而不是对象实例的类参数。
  • 它可以修改将应用于类的所有实例的类状态。例如,它可以修改适用于所有实例的类变量。

静态方法

静态方法不接收隐式第一个参数。
句法:

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

类方法与静态方法

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

什么时候用什么?

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

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

要在Python定义类方法,我们使用 @classmethod 装饰器,并使用 @staticmethod 装饰器定义静态方法。
让我们看一个例子来理解它们之间的区别。假设我们要创建一个类 Person。现在, Python不支持像 C++ 或Java那样的方法重载,所以我们使用类方法来创建工厂方法。在下面的例子中,我们使用一个类方法从出生年份创建一个人对象。

如上所述,我们使用静态方法来创建实用程序函数。在下面的例子中,我们使用静态方法来检查一个人是否是成年人。

执行

# Python program to demonstrate 
# use of class method and static method.
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)
       
    # a static method to check if a Person is adult or not.
    @staticmethod
    def isAdult(age):
        return age > 18
   
person1 = Person('mayank', 21)
person2 = Person.fromBirthYear('mayank', 1996)
   
print (person1.age)
print (person2.age)
   
# print the result
print (Person.isAdult(22))

输出

21
21
True