Python 私有变量和私有方法介绍

Python 私有变量和私有方法介绍

关于 Python 私有变量和私有方法,通常情况下,开发者可以在方法或属性名称前加上单下划线(_),以表示该方法或属性仅供内部使用,但这只是一种约定,并没有强制执行禁止外部访问。要真正实现“私有”的效果,可以在方法或属性名称前加上双下划线(__),在 Python 内部自动将方法或属性名称改写,这样就无法从类的外部直接访问了,但仍然可以通过在其前面添加单下划线和类名的方式来访问。

Python 私有变量

在Python中,私有变量是指在类定义中以两个下划线(__)开头的变量。这些变量被认为是私有的,因为它们不能从类的外部直接访问。

【Python 私有变量的官方说明 https://docs.python.org/zh-cn/3/tutorial/classes.html#private-variables 】

Python将双下划线作为前缀来对属性进行名称修饰,使得这些属性在类的外部无法通过简单的名称访问。但是,在类的内部,这些属性可以像其他属性一样使用,只不过需要使用特殊的名称来引用它们。

例如:

class MyClass:
    def __init__(self):
        self.__private_var = 42

    def get_private_var(self):
        return self.__private_var

my_object = MyClass()
print(my_object.get_private_var())  # 输出结果:42
#print(my_object.__private_var)      # 报错:AttributeError: 'MyClass' object has no attribute '__private_var'
print(my_object._MyClass__private_var)# 输出结果:42 ,可以这样访问私有变量,但是不建议

在上述代码中,我们定义了一个名为 MyClass 的类,并在其构造函数 __init__() 中设置了一个私有变量 __private_var。然后,我们定义了一个名为 get_private_var() 的方法,该方法返回私有变量 __private_var 的值。

当我们创建一个新的 MyClass 实例并调用 get_private_var() 方法时,我们可以成功地获取私有变量的值并输出它。但是,当我们尝试直接访问私有变量 __private_var 时,Python会抛出 AttributeError 异常,因为该属性不是公共的,不能从类的外部直接访问。

需要注意的是,在Python中,私有属性不是真正的私有。它们仍然可以通过特殊的名称来访问。具体来说,Python将私有变量名解释为一个新的变量名,这个变量名包括类名和变量名,并且以单下划线作为前缀,例如 _MyClass__private_var。虽然这种方式可以在某些情况下访问私有变量,但是强烈建议不要这样做,因为这会使你的代码更难理解和维护。

Python私有方法

在 Python 中,可以使用双下划线(__)来定义“私有”方法,这些方法只能在类的内部访问。具体来说,双下划线开头的方法名称会被 Python 解释器重命名为 _ClassName__my_private_method 的形式,因此在外部无法直接调用。

例如:

class MyClass:
    def __init__(self):
        self.__my_private_var = 42

    def __my_private_method(self):
        print("This is a private method.")
        print(f"The value of my_private_var is {self.__my_private_var}.")

obj = MyClass()
# obj.__my_private_method()  # 报错:AttributeError: 'MyClass' object has no attribute '__my_private_method'
obj._MyClass__my_private_method()  # Output: This is a private method. The value of my_private_var is 42.

在这个示例中,我们定义了一个 MyClass 类,并在其中定义了一个“私有”方法 __my_private_method,该方法只能在类的内部访问。然后,我们创建了一个 MyClass 的对象并将其赋给变量 obj,但如果尝试直接调用 obj.__my_private_method(),会导致 AttributeError 错误,因为该方法是“私有”的。相反,我们可以通过 _MyClass__my_private_method() 方法来间接地调用该方法。

尽管在 Python 中可以通过特殊的名称来访问“私有”方法,但这并不是一种好的编程风格。

附录

python/类和实例-访问限制https://www.codenong.com/cs106668667/

Python面向对象程序设计中类的定义、实例化、封装及私有变量/方法详解https://www.jb51.net/article/157112.htm

你可能感兴趣的:(Python学习,python,开发语言)