变量命名法则
在Python语言中,标识符的命名必须遵守一定的规则。变量名可以由字母、数字和下划线组成,但数字不能作为首字符。此外,Python允许使用下划线作为变量名的首字符,这是一个广泛接受的命名协议。
在Python社区中,下划线作为变量的第一个字符有着特殊的含义。单下划线开头的变量通常用来指示变量为"内部使用"或"非公开"(non-public)。尽管Python不强制访问这些变量,但是根据默契,开发者认为这些变量应该在模块或类别内部使用,而不是为库或框架的用户设计的。
另外,当使用两个下划线作为变量名首字符时,Python会改编变量名称。(name mangling),将类名添加到变量名前,主要用于在类内部定义私有属性,避免子类定义的同名属性覆盖。使用单下划线变量示例
class Test:
def __init__(self):
self._internal = 10 # 内部变量,通过单一下划线表示。
self.public = 5 # 公共变量,无下划线
def _internal_method(self):
# 它是一种内部方法,通过单一的划线表示,不应从类的外部调用。
pass
上述代码显示了如何使用单下划线来命名内部变量和内部方法。即使编程人员可以从类的外部访问这些变量和方法,我们也应该根据Python命名的惯例将其视为类的内部使用细节。使用双下划线变量示例
class MyClass:
def __init__(self):
self.__private = 'I am a private variable'
def __private_method(self):
# 它是一种私有的方法
print(self.__private)
obj = MyClass()
# print(obj.__private) # 会导致AttributeError,由于这是一个私有变量
# obj.__private_method() # AttributeError是一种私人方法,因为它是一种私人方法。
# 正确的访问方式,如下所示:
print(obj._MyClass__private) # 访问名称改编后的变量名
obj._MyClass__private_method() # 名称改编后的方法名访问
上述代码描述了私有变量和私有方法的命名。虽然Python实际上并没有实现真正的私有化,但它提供了一种变相的私有属性和命名方法,通过改编变量名的机制。在特殊方法中,下划线的应用
特殊方法(magic methods)或者魔法方法,在Python中常常以双下划线开头和结尾,例如:init 、str、__getitem__等等。这些特殊方法为开发者提供了类结构、字符串表示形式定义、元素获取等功能的可能性。
这些特殊的魔法方法并不意味着它们是私有的。事实上,它们是Python频繁调用的一种特殊方法,代表了特定语义的官方协议。特殊方法应用示例
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y
def __repr__(self):
return f"Vector({self.x}, {self.y})"
# 定制加法运算
def __add__(self, other):
if isinstance(other, Vector):
return Vector(self.x + other.x, self.y + other.y)
else:
raise ValueError(“参数必须是Vector类型”)
# 创建两个向量的例子
v1 = Vector(2, 4)
v2 = Vector(1, 3)
# 使用特殊方法___add进行向量加法计算__
v3 = v1 + v2
print(v3) # 输出 Vector(3, 7)
通过特殊方法___,定义了一个Vector类。init通过特殊方法___实现了类的构造器。repr通过___为Vector对象提供正式的字符串表示,add__实现了两个向量对象的加法操作。这反映了Python特殊方法的强大功能,以及它们在实现对象行为中的重要性。
综上所述,Python的变量命名机制灵活而富有表现力。合理使用下划线命名可以有效地传达代码的意图,提高代码的可读性和可维护性。Python语言的设计理念体现在内部使用的单下划线、私有化的双下划线和代表特定语义的魔法方法上:"一切都是对象"和对开发者的尊重和信任。