类
封装
创建类
在 Python 中,可以使用 class 关键字来创建类。类中包含了对象的属性(实例变量)和方法(函数)。比如我们可以创建一个“动物”类可以作为面向对象编程的入门示例。我们会从基本定义开始,逐步增加细节。
class Animal:
pass
class 后面紧接着是类名,我们给动物类起名 Animal,类名通常是大写开头的单词。有时候类名后面会接一个括号,括号中的是新定义的类的父类,后文会演示如何指定父类。如果没有指明父类,表示默认从 Python 预定义的 object 类继承。Python 程序中,所有的类都是 object 类的子孙类。
类的对象
在程序中直接使用一个类的情况是比较少的,多数情况下,我们会为一个类创建一个或数个对象,然后访问对象的属性或方法。在程序中写出类的名字,然后加上一个括号,就可以生成一个新的类的对象。如果在变量赋值表达式的右侧生成新的对象,就可以让变量指向这个新生成的对象:
dog = Animal()
属性
Python 中要区分“类的属性”,和“对象的属性”。在多数其它语言中,这两项是不区分的。
在类中添加一些变量,这些变量就会成为类的属性。比如,我们可以为类添加一个属性 total_animals,用于统计总共创建了多少个动物:
class Animal:
total_animals = 0 # 类变量,跟踪创建的动物数量
dog = Animal()
print(Animal.total_animals) # 输出: 0, 直接使用类名进行访问
print(dog.total_animals) # 输出: 0, 也可以通过实例进行访问
访问类的属性的时候,在类名的后面加一个点号 .
然后加上属性的名字即可。如果类的对象中没有同名的属性,那么通过对象读取这个属性,它会自动返回类的属性的值。比如上面示例中 dog.total_animals
,dog 对象并没有 total_animals 属性,但是它会返回 Animal 类相应的属性的值。
对象的属性,可以通过变量赋值语句进行添加,比如,为新生成的对象 dog 添加一个名为 age 的属性:
class Animal:
name = '旺财'
dog = Animal()
dog.age = 3
print(dog.age) # 输出: 3
dog.age
就表示 dog 对象的名为 age 的属性。
在 Python 中,方法是绑定到对象或类的可调用对象,可以通过属性访问的方式调用。关于这一点,我们将在动态访问属性和方法中进行解释。
初始化方法
改为“初始化方法(__init__
)用于初始化对象的状态,有时也称为构造函数、构造方法。Python 中,还有一个 __new__
函数,也会被成为构造方法,后文会有详细介绍,这里主要介绍 __init__
方法。
创建对象之后,再为其设置属性值,并不是好的编程方式。最好是在创建对象的同时,就把属性的初始值都设置好。我们可以使用类的初始化方法来达到这一目的。类的初始化函数 __init__
是一个特殊的方法,当创建类的新实例时,它会自动被调用。后文,我们将还会介绍其它一些 Python 定义的类的特殊方法,它们的函数名都是用双下划线开始和结尾的。__init__
方法的第一个参数必须是 self。self 是一个指向实例本身的参数,它也必须作为类中每一个对象方法的第一个参数。当调用对象的方法时,Python 会自动传递当前对象的引用给 self。
class Animal:
def __init__(self, name, species):
self.name = name
self.species = species
# 使用:
dog = Animal("旺财", "狗")
chick = Animal("花冠", "鸡")
print(dog.name) # 输出: 旺财
print(chick.name) # 输出: 花冠
上面程序中,Animal 类的 __init__
初始化函数,除了 self 之外,还有两个参数 name 和 species,分别表示动物的名字和品种。有了初始化函数,我们就可以在创建对象时,为类传递必要的参数了,比如 Animal("旺财", "狗")
会创建一个名为旺财,品种为狗的动物类实例。在构造函数中,它通过为 self.name
和 self.species
赋值,创建了两个对象属性的值。
在很多编程语言中,可以为一个类创建具有不同参数的多个构造函数。但 Python 中,每个类通常定义一个 __init__
方法来初始化实例,但可以通过参数设计实现多种初始化方式。也可以利用工厂方法,以不同参数创建类的实例。