介绍
在类级别上,变量被称为 类变量,而实例级别的变量被称为 实例变量。
当我们预期变量将在各个实例之间保持一致时,或者当我们希望初始化变量时,我们可以在类级别上定义该变量。
软件开发的一个原则是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
对象实例初始化的变量值组成。
让我们创建一个名为stevie
的Shark
类别的对象:
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
类的两个对象中使用了类和实例变量,sammy
和stevie
。
结论
在对象导向编程中,类级的变量被称为类变量,而对象级的变量被称为实例变量。
这种差异化允许我们使用类变量来初始化具有分配给变量特定值的对象,并为每个对象使用实例变量使用不同的变量。
使用类和实例特定的变量可以确保我们的代码遵守DRY原则,以减少代码中的重复。