2.2.1 命名规则

Python语言有一套自己的命名规则,用户也可以借鉴Java语言的命名规则形成自己命名的规则。命名规则并不是规定,只是一种习惯用法。下面介绍几个常见规范。

1.变量名、包名、模块名

变量名、包名、模块名通常采用小写,可使用下划线,示例如下。


01     # 变量、模块名的命名规则
02     # Filename: ruleModule.py
03     
04     _rule = "rule information"

【代码说明】

·第2行代码声明模块的名称,模块名采用小写。也可以不指定模块名,以py后缀的文件就是一个模块。模块名就是文件名。

·第4行代码定义了一个全局变量_rule。

2.类名、对象名

类名首字母采用大写,对象名采用小写。类的属性和方法名以对象作为前缀。类的私有变量、私有方法以两个下划线作为前缀。下面【例2-1】这段代码演示了类的定义和实例化的规范写法。

【例2-1.py】


01     class Student:                           # 类名大写
02          __name = ""                          # 私有实例变量前必须有两个下划线
03          def __init__(self, name):        # 创建init函数,自动调用并初始化
04              self.__name = name               # self相当于Java中的this
05          def getName(self):                   # 方法名首字母小写,其后每个单词的首字母大写
06              return self.__name             # 返回name的值
07     
08     if __name__ == "__main__":             # 主程序运行
09          student = Student("borphi")       # 对象名小写
10          print(student.getName())         # 输出调用函数getName获得的值

【代码说明】

·第1行代码定义了一个名为Student的类,类名首字母大写。

·第2行代码定义了一个私有的实例变量,变量名前有两个下划线。

·第4行代码使用self前缀说明__name变量属于Student类。

·第5行代码定义了一个公有的方法,方法名首字母小写,其后的单词Name首字母大写。函数的命名规则和方法名相同。

·第9行代码创建了一个student对象,对象名小写。

·第10行代码输出结果为:borphi。

说明 关于面向对象的知识会在第9章详细介绍,这里读者只需要知道类、对象、属性以及方法的书写方式即可。

3.函数名

函数名通常采用小写,并用下划线或单词首字母大写增加名称的可读性,导入的函数以模块名作前缀。下例中,为了演示导入函数前缀写法,使用了生成随机数的模块random。该模块有一个函数randrange()。该函数可以根据给定的数字范围生成随机数。randrange()声明如下所示:


randrange(start, stop[, step])

【代码说明】

·参数start表示生成随机数所在范围的开始数字。

·参数stop表示生成随机数所在范围的结束数字,但不包括数字stop。

·参数step表示从start开始往后的步数。生成的随机数在[start,stop-1]的范围内,取值等于start+step。

例如:


randrange(1, 9, 2)

随机数的范围在1、3、5、7之间选取。下面【例2-2】这段代码演示了函数的规范写法,其中定义了一个compareNum(),该函数用于比较两个数字的大小,并返回对应的结果。

【例2-2.py】


01     # 函数中的命名规则
02     import random                           # 导入random模块
03     
04     def compareNum(num1, num2):            # 定义带参数的compareNum函数
05         if(num1 > num2):                       # if判断两个数大小,返回不同的值
06             return 1
07         elif(num1 == num2):
08             return 0
09         else:
10             return -1
11     num1 = random.randrange(1, 9)           # 产生随机数并赋值给num1
12     num2 = random.randrange(1, 9)           # 产生随机数并赋值给num2
13     print( "num1 =", num1)
14     print ("num2 =", num2)
15     print (compareNum(num1, num2))          # 调用compareNum函数

【代码说明】

·第2行代码导入了random模块。

·第4行代码定义了一个函数compareNum(),参数num1、num2为待比较的两个变量。

·第5行到第10行代码比较两个数的大小,返回不同的结果。

·第11、12行代码调用random模块的randrange()函数,返回两个随机数。

·第13、14行代码输出随机数,不同的机器、不同的执行时间得到的随机数均不相同。

·第15行代码调用compareNum(),并把产生的两个随机数作为参数传入。

良好命名可以提高编程效率,可以使代码阅读者在不了解文档的情况下,也能理解代码的内容。下面以变量的命名为例说明如何定义有价值的名称。许多程序员对变量的命名带有随意性,如使用i、j、k等单个字母。代码阅读者并不知道这些变量的真实含义,需要阅读文档或仔细查看源代码才能了解其含义。下面是一个命名不规范的例子。


01     # 不规范的变量命名
02     sum = 0
03     i = 2000
04     j = 1200
05     sum = i + 12 * j

【代码说明】这段代码定义了一个求和变量sum,以及两个变量i、j。如果只看代码片段,并不知道运算的含义是什么,需要通读整个函数或功能模块才能理解此处表达式的含义。

下面是一个良好命名的例子。


01     # 规范的变量命名
02     sumPay = 0
03     bonusOfYear = 2000
04     monthPay = 1200
05     sumPay = bonusOfYear + 12 * monthPay

【代码说明】bonusOfYear表示年终奖金、monthPay表示月薪,因此sumPay表示全年的薪水。命名良好的变量可以节省阅读程序的时间,更快地理解程序的含义。

注意 变量的命名应尽可能地表达此变量的作用,尽量避免使用缩写,以至于任何人都能理解变量名的含义。不用担心变量名的长度,长的变量名往往能更清楚地表达意思。

以上讨论的命名方式同样适用于模块名、类名、方法名、属性名等。命名规则会带来很多益处。统一命名规则便于开发团队合作开发同一个项目;便于统一代码的风格,理解不同程序员编写的代码;命名规范的变量名使函数的内容更容易被理解;避免项目中随意命名变量的情况,促进程序员之间的交流。规则并不是绝对的,统一规则、表达清楚名称的含义才是制定规则的原因。