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篇 类方法的主要内容,如果未能解决你的问题,请参考以下文章