大锤python日记(通过名字重整实现私有属性)

83 阅读1分钟

在Python中,使用双下划线作为前缀来定义私有属性或方法。Python并没有像Java或C++那样提供真正的私有性,而是通过名字重整(Name Mangling)机制实现了一定程度的保护。

具体来说,Python会将以双下划线开头但不以双下划线结尾的属性名进行重命名。重命名规则是在属性名前添加一个下划线,再加上类名,最后再加上原始属性名。

下面是一个例子:

class MyClass:
    def __init__(self):
        self.__private_attr = 42   # 定义私有属性

    def print_private_attr(self):
        print(self.__private_attr)

my_obj = MyClass()
my_obj.print_private_attr()  # 输出 42

print(my_obj.__private_attr)   # 报错,因为无法访问私有属性

# 使用名字重整机制可以间接地访问私有属性
print(my_obj._MyClass__private_attr)  # 输出 42

在上面的代码中,我们定义了一个名为MyClass的类,并在其构造函数中定义了一个私有属性__private_attr。然后我们定义了一个名为print_private_attr的公共方法,用于在外部打印私有属性的值。在实例化对象之后,我们调用该方法,成功输出了私有属性的值。但是,当我们试图直接访问私有属性时,Python解释器将抛出AttributeError异常。但是,通过在属性名前加上类名和下划线,我们可以间接地访问私有属性。

需要注意的是,虽然您可以通过使用名字重整机制来访问私有属性,但这并不是一种良好的编程实践。私有属性和方法应该被视为不可访问的,并且只能在类内部使用。