Python私有属性与方法详解:命名修饰机制与访问技巧
本文深入解析Python中私有属性和方法的实现机制。通过双下划线前缀定义私有成员,Python利用命名修饰(Name Mangling)技术将内部名称转换为`_类名__成员名`形式,从而在类外部阻止直接访问。文章演示了私有属性与方法的使用、报错原因及通过修饰后名称间接访问的技巧,帮助开发者理解Python的封装特性。
Python私有属性与方法详解:命名修饰机制与访问技巧
如何在Python中正确使用私有属性和方法
class File:
def __init__(self, name):
self.name = name
self.code = "ABCDEF"
file_A = File("file_A")
私有属性的定义与访问限制
假设我们定义了一个名为File的类,并创建了一个实例对象file_A。

访问file_A.code
如果直接调用该属性,可以查看其内容。但若该属性包含敏感信息如密码,直接暴露是不安全的处理方式。

class File:
def __init__(self, name):
self.name = name
self.__code = "ABCDEF"
file_A = File("file_A")
print(file_A.code)
为了防止信息泄露,可以在属性名前添加双下划线(__)将其设为私有,但此时直接调用会引发错误。

class File:
def __init__(self, name):
self.name = name
self.__code = "ABCDEF"
file_A = File("file_A")
print(file_A.__code)
许多人误以为是因为外部调用时少写了下划线导致错误,实际上这是因为该属性已被定义为私有属性,标准访问方式被拦截。

class File:
def __init__(self, name):
self.name = name
self.__code = "ABCDEF"
def open(self):
print("This is the AAA file!")
file_A = File("file_A")
file_A.open()
私有方法的实现与调用
除了属性,方法是否也能设置为私有?答案是肯定的。

class File:
def __init__(self, name):
self.name = name
self.__code = "ABCDEF"
def __open(self):
print("This is the AAA file!")
file_A = File("file_A")
file_A.__open()
私有方法的处理结果与私有属性类似,直接调用同样会报错。

class File:
def __init__(self, name):
self.name = name
self.__code = "ABCDEF"
def __open(self):
print("This is the AAA file!")
file_A = File("file_A")
print(file_A._File__code)
file_A._File__open()
通过命名修饰访问私有成员
在Python中,如果在方法或属性名前加上单下划线和类名(即使用命名修饰后的名称),就可以访问这些私有的属性和方法。

知识点扩展:
Python私有机制的核心原理
Python默认的成员函数和成员变量均为公开状态,且不像其他语言那样使用public或private等关键字进行修饰。在Python中,只需在变量名或函数名前添加两个下划线("__"),即可将其定义为私有。在内部,Python使用一种名为“命名修饰”(name mangling)的技术,将`__membername`替换为`_classname__membername`。因此,当你在类外部尝试使用原始私有成员名称时,系统会提示找不到该属性。例如:
class Person:
def __init__(self):
self.__name = 'haha'#私有属性
self.age = 22
def __get_name(self):##私有方法
return self.__name
def get_age(self):
return self.age
person = Person()
print person.get_age()
print person.__get_name()
运行结果是:22 Traceback (most recent call last): File "E:\pythoner\zenghe\jay.py", line 38, in print person.__get_name() AttributeError: Person instance has no attribute '__get_name'
这里定义的__name是私有属性,__get_name()是私有方法。如果直接访问,会提示找不到相关属性或方法。但如果确实需要访问私有数据,也是可行的。严格来说,私有方法在类外部是可以访问的,只是通过常规名称难以处理。在Python中,并没有绝对意义上的私有;内部通过改变和恢复私有方法及属性的名称,使得它们看似无法通过给定名称直接使用。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









