在Python类的方法名前面加双下划线(__)可以让该方法在外部不可访问。
class Student:
#student1方法可以在类的外部访问
def student1(self):
print("student1")
#__student2方法不可以在类的外部访问
def __student2(self):
print("student2")
p = Student()
p.student1()
p.__student2 #会报错
执行上述代码,会抛出以下信息:
student1
Traceback (most recent call last):
File "D:\软件脚本\python脚本\04.py", line 20, in <module>
p.__student2 #会报错
AttributeError: 'Student' object has no attribute '__student2'
其实“student2”方法也不是绝对不可访问。Python编译器在编译Python源代码时并没有将“student2”方法真正私有化,而是一旦遇到方法名以双下划线(__)开头的方法,就会将方法名改成“ClassNamemethodName”的形式。其中ClassName表示该方法所在的类名,“methodName”表示方法名。ClassName前面要加上但单下划线()前缀。
对于上面的代码,Python编译器会将“student2”方法更名为“_Studentstudent2”,所以在类的外部调用“student2”方法会抛出异常。抛出异常的原因并不是“student2”方法被私有化了,而是Python编译器把“method2”的名称改为“_Personmethod2”了。当我们了解了这些背后的原理,就可以通过调用“_Studentstudent2”方法来执行“student2”方法
p = Student()
p.student1()
p._Student__student2()
此时,变成功调用student2了,
student1
student2