了解 Python 3 中的类变量和实例变量

介绍

面向对象的编程允许在类级或实例级使用 变量

在类级别上,变量被称为 类变量,而实例级别的变量被称为 实例变量

当我们预期变量将在各个实例之间保持一致时,或者当我们希望初始化变量时,我们可以在类级别上定义该变量。

软件开发的一个原则是DRY原则,它代表不要重复自己,该原则旨在限制代码内部的重复,而面向对象的编程遵循DRY原则,因为它减少了冗余。

本教程将展示Python中对象导向编程中的类和实例变量的使用。

前提条件

如果您没有设置编程环境,您可以参考本地编程环境的安装和安装指南(https://www.digitalocean.com/community/tutorial_series/how-to-install-and-set-up-a-local-programming-environment-for-python-3)或适用于您的操作系统(Ubuntu, CentOS, Debian 等)的编程环境(https://www.digitalocean.com/community/tutorial_collections/how-to-install-python-3-and-set-up-a-programming-environment)。

类变量

类变量在 [类构建] 中定义(https://andsky.com/tech/tutorials/how-to-construct-classes-and-define-objects-in-python-3)。因为它们属于类本身,所以类变量由该类的所有实例共享,因此它们通常对每个实例都具有相同的值,除非您使用类变量来初始化变量。

定义在所有方法之外,类变量通常被放置在类标题下面,并在 constructor 方法和其他方法之前。

<$>[info] 信息: 要跟进本教程中的示例代码,请在本地系统上运行python3命令,打开Python交互壳。

单个类变量看起来如下:

1class Shark:
2    animal_type = "fish"

在这里,变量 animal_type 被分配为值 `"fish" 。

我们可以创建一个Shark类的实例(我们将其称为new_shark),并使用点符号打印变量:

1[label shark.py]
2class Shark:
3    animal_type = "fish"
4
5new_shark = Shark()
6print(new_shark.animal_type)

让我们运行这个程序:

1python shark.py
1[secondary_label Output]
2fish

我们的程序返回变量的值。

让我们添加一些其他类变量并打印它们:

 1[label shark.py]
 2class Shark:
 3    animal_type = "fish"
 4    location = "ocean"
 5    followers = 5
 6
 7new_shark = Shark()
 8print(new_shark.animal_type)
 9print(new_shark.location)
10print(new_shark.followers)

与任何其他变量一样,类变量可以由我们在Python中可用的任何数据类型(https://andsky.com/tech/tutorials/understanding-data-types-in-python-3)组成。 在这个程序中,我们有字符串和整数。

1[secondary_label Output]
2fish
3ocean
45

new_shark的实例可以访问所有类变量,并在我们运行程序时打印它们。

类变量允许我们在构建类时定义变量,然后这些变量及其相关值可供类的每个实例访问。

变量实例

实例变量由类的实例拥有,这意味着对于一个类的每个对象或实例,实例变量是不同的。

与类变量不同,实例变量在方法中定义。

在下面的Shark类示例中,名称年龄是实例变量:

1class Shark:
2    def __init__(self, name, age):
3        self.name = name
4        self.age = age

当我们创建一个Shark对象时,我们将不得不定义这些变量,这些变量作为构建方法或其他方法中的参数传递。

1class Shark:
2    def __init__(self, name, age):
3        self.name = name
4        self.age = age
5
6new_shark = Shark("Sammy", 5)

与类变量一样,我们可以类似地称之为打印实例变量:

1[label shark.py]
2class Shark:
3    def __init__(self, name, age):
4        self.name = name
5        self.age = age
6
7new_shark = Shark("Sammy", 5)
8print(new_shark.name)
9print(new_shark.age)

当我们使用python shark.py运行上述程序时,我们将收到以下输出:

1[secondary_label Output]
2Sammy
35

我们接收的输出由我们为new_shark对象实例初始化的变量值组成。

让我们创建一个名为stevieShark类别的对象:

 1[label shark.py]
 2class Shark:
 3    def __init__(self, name, age):
 4        self.name = name
 5        self.age = age
 6
 7new_shark = Shark("Sammy", 5)
 8print(new_shark.name)
 9print(new_shark.age)
10
11stevie = Shark("Stevie", 8)
12print(stevie.name)
13print(stevie.age)
1[secondary_label Output]
2Sammy
35
4Stevie
58

stevie对象,像new_shark对象一样,通过了Shark类的该实例特定的参数,将值分配给该实例变量。

实例变量,属于类的对象,允许每个对象或实例有不同的值分配给这些变量。

与类和实例变量一起工作

类变量和实例变量通常会同时使用,所以让我们看看使用我们创建的Shark类的例子。

 1[label shark.py]
 2class Shark:
 3
 4    # Class variables
 5    animal_type = "fish"
 6    location = "ocean"
 7
 8    # Constructor method with instance variables name and age
 9    def __init__(self, name, age):
10        self.name = name
11        self.age = age
12
13    # Method with instance variable followers
14    def set_followers(self, followers):
15        print("This user has " + str(followers) + " followers")
16
17def main():
18    # First object, set up instance variables of constructor method
19    sammy = Shark("Sammy", 5)
20
21    # Print out instance variable name
22    print(sammy.name)
23
24    # Print out class variable location
25    print(sammy.location)
26
27    # Second object
28    stevie = Shark("Stevie", 8)
29
30    # Print out instance variable name
31    print(stevie.name)
32
33    # Use set_followers method and pass followers instance variable
34    stevie.set_followers(77)
35
36    # Print out class variable animal_type
37    print(stevie.animal_type)
38
39if __name__ == "__main__":
40    main()

当我们使用python shark.py运行该程序时,我们将收到以下输出:

1[secondary_label Output]
2Sammy
3ocean
4Stevie
5This user has 77 followers
6fish

在这里,我们在Shark类的两个对象中使用了类和实例变量,sammystevie

结论

在对象导向编程中,类级的变量被称为类变量,而对象级的变量被称为实例变量。

这种差异化允许我们使用类变量来初始化具有分配给变量特定值的对象,并为每个对象使用实例变量使用不同的变量。

使用类和实例特定的变量可以确保我们的代码遵守DRY原则,以减少代码中的重复。

Published At
Categories with 技术
comments powered by Disqus