📜  Python中的类方法()

📅  最后修改于: 2022-05-13 01:54:24.545000             🧑  作者: Mango

Python中的类方法()

classmethod()是Python中的内置函数,它返回给定函数的类方法。

您还可以使用 @classmethod 装饰器来定义类方法。

句法:

@classmethod
   def fun(cls, arg1, arg2, ...):

在哪里,

  • fun:需要转换成类方法的函数
  • 返回:函数的类方法。

classmethod() 方法绑定到类而不是对象。类方法可以被类和对象调用。这些方法可以用类或对象调用。

类方法与静态方法

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

Python中的类方法示例

示例 1:创建一个简单的类方法

在这个例子中,我们将看到如何创建类方法,为此我们创建了一个具有极客名称和成员变量 course 的类,并创建了一个打印对象的函数purchase。

现在我们将 geeks.purchase 方法传递到 classmethod 中,该方法将方法转换为类方法,然后我们调用类函数purchase 而不创建函数对象。

Python3
class geeks:
    course = 'DSA'
  
    def purchase(obj):
        print("Puchase course : ", obj.course)
  
  
geeks.purchase = classmethod(geeks.purchase)
geeks.purchase()


Python3
# Python program to understand the classmethod
  
class Student:
  
    # create a variable
    name = "Geeksforgeeks"
  
    # create a function
    def print_name(obj):
        print("The name is : ", obj.name)
  
  
# create print_name classmethod
# before creating this line print_name()
# It can be called only with object not with class
Student.print_name = classmethod(Student.print_name)
  
# now this method can be called as classmethod
# print_name() method is called a class method
Student.print_name()


Python3
# Python program to demonstrate
# use of a 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)
  
    def display(self):
        print("Name : ", self.name, "Age : ", self.age)
  
person = Person('mayank', 21)
person.display()


Python
# Python program to demonstrate
# use of a 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))


输出:

Puchase course :  DSA

示例 2:使用 classmethod() 创建类方法

Python3

# Python program to understand the classmethod
  
class Student:
  
    # create a variable
    name = "Geeksforgeeks"
  
    # create a function
    def print_name(obj):
        print("The name is : ", obj.name)
  
  
# create print_name classmethod
# before creating this line print_name()
# It can be called only with object not with class
Student.print_name = classmethod(Student.print_name)
  
# now this method can be called as classmethod
# print_name() method is called a class method
Student.print_name()

输出:

The name is :  Geeksforgeeks

示例 3:使用 Class 方法的工厂方法

classmethod()函数的使用用于工厂设计模式中,我们希望使用类名而不是对象调用许多函数。

Python3

# Python program to demonstrate
# use of a 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)
  
    def display(self):
        print("Name : ", self.name, "Age : ", self.age)
  
person = Person('mayank', 21)
person.display()

输出:

Name :  mayank Age :  21

@classmethod 装饰器

@classmethod 装饰器是一个内置的函数装饰器,它是一个表达式,在定义你的函数后得到评估。该评估的结果会影响您的函数定义。

类方法接收类作为隐式第一个参数,就像实例方法接收实例一样。

句法:

class C(object):
    @classmethod
    def fun(cls, arg1, arg2, ...):
       ....

在哪里,

  • fun:需要转换成类方法的函数
  • 返回:函数的类方法。

笔记:

  • 类方法是绑定到类而不是类的对象的方法。
  • 他们可以访问类的状态,因为它需要一个指向类而不是对象实例的类参数。
  • 它可以修改适用于类的所有实例的类状态。例如,它可以修改适用于所有实例的类变量。

在下面的示例中,我们使用 staticmethod() 和 classmethod() 来检查一个人是否是成年人。

Python

# Python program to demonstrate
# use of a 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
25
True