Python面向对象编程第07篇 类方法

Posted 不剪发的Tony老师

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python面向对象编程第07篇 类方法相关的知识,希望对你有一定的参考价值。

本篇介绍类方法(class method)的概念,以及如何调用类方法。

类方法简介

前文我们学习了实例方法,实例方法和类的具体实例相关联。

实例方法可以访问类中的实例变量。调用实例方法之前需要创建一个实例。以下示例定义了一个 Person 类:

class Person:
    def __init__(self, first_name, last_name, age):
        self.first_name = first_name
        self.last_name = last_name
        self.age = age

    def get_full_name(self):
        return f"self.first_name self.last_name"

    def introduce(self):
        return f"Hi. I'm self.first_name self.last_name. I'm self.age years old."

Person 类拥有三个实例方法:__init__()、get_full_name() 以及 introduce()。

假设我们想要增加一个方法,用于创建 Person 类的一个匿名者。为此,我们可以使用以下代码:

class Person:
    # ... other methods
    def create_anonymous(self):
        return Person('John', 'Doe', 25)

create_anonymous() 是一个实例方法,用于返回一个匿名者。

但是为了调用 create_anonymous() 方法,我们需要创建一个实例。这样的话这个方法就没有意义了。此时我们需要用到 Python 的类方法。

类方法不与任何具体实例关联,只和类自身相关联。定义类方法的步骤如下:

  • 首先,在类定义的前面增加一个 @classmethod 装饰器(decorator)。目前,我们只需要知道 @classmethod 装饰器可以将实例方法修改为类方法。
  • 其次,将参数 self 重命名为 cls。cls 代表了 class,但是 class 是一个关键字,所以不能作为参数名。

以下是重新定义的 Person 类:

class Person:
    def __init__(self, first_name, last_name, age):
        self.first_name = first_name
        self.last_name = last_name
        self.age = age

    def get_full_name(self):
        return f"self.first_name self.last_name"

    def introduce(self):
        return f"Hi. I'm self.first_name self.last_name. I'm self.age years old."

    @classmethod
    def create_anonymous(cls):
        return Person('John', 'Doe', 25)

create_anonymous() 方法不能访问实例属性,但是可以通过 cls 变量访问类属性。

调用类方法

类方法可以通过类名加上点号以及方法名进行调用,例如:

ClassName.method_name()

以下示例调用了 Person 类的 create_anonymous() 方法:

anonymous = Person.create_anonymous()
print(anonymous.introduce())

输出结果如下:

Hi. I'm John Doe. I'm 25 years old.

类方法和实例方法

下表列出了类方法和示例方法之间的区别:

特性类方法实例方法
绑定类的具体实例
调用方式Class.method()object.method()
访问类属性实例属性和类属性

对于任何与具体实例无关的方法都可以定义为类方法。在实际编程中,我们通常使用类方法创建实例对象。创建并返回类实例的方法被称为工厂方法(factory method)。例如,上面的 create_anonymous() 就是一个工厂方法,因为它返回了一个新的 Person 类实例。

总结

  • Python 类方法不与任何具体实例相关联,属于类自身。
  • @classmethod 装饰器用于定义类方法,它的第一个参数为 cls。
  • 类方法可以用于实现工厂方法。

以上是关于Python面向对象编程第07篇 类方法的主要内容,如果未能解决你的问题,请参考以下文章

Python面向对象编程第10篇 静态方法

Python面向对象编程02:深度认识类class

Python面向对象编程02:深度认识类class

Python面向对象编程第20篇 删除属性

Python面向对象编程第20篇 删除属性

Python面向对象编程第01篇 OOP简介