Python对于类的成员没有严格的访问控制限制,这与其他面向对象的编程语言是有所区别的。
关于私有方法其实和私有属性差不多,有如下要点:
对象.方法名直接调用。_类名__私有方法名访问私有方法。示例:
# 在函数名的前面添加两个下划线,此时该函数被称为私有函数# 只能在当前类中被直接调用,不同通过对象.方法名调用# 私有函数class Student(): def __init__(self, name, age): # 普通变量 self.name = name # 私有变量 self.__age = age def tellMe(self): print(f"大家好,我是{self.name}。是一个公共方法") # 在公共函数中调用私有方法, # 调用格式:self.__私有的函数名称(参数列表) self.__tellMeAll() # 定义一个私有方法 def __tellMeAll(self): print(f"我{self.__age}岁,但我一般不告诉别人。是一个私有方法") # 在公共函数中调用私有方法, # 调用格式:self.__私有的函数名称(参数列表)# 创建一个Student对象stu = Student("美猴王", 18)# 调用公共方法"""输出结果:大家好,我是美猴王。是一个公共方法我18岁,但我一般不告诉别人。是一个私有方法从结果中可以看到,公共方法可以直接通过对象.方法名直接调用。私有方法可以再对象中被调用。"""stu.tellMe()# 通过对象.方法名直接调用私有方法# 报错# AttributeError: 'Student' object has no attribute '__tellMeAll'# stu.__tellMeAll()# 通过对象.方法名直接调用私有方法# 没有报错# 输出:我18岁,但我一般不告诉别人。是一个私有方法stu._Student__tellMeAll()类中的成员私有优化原理总结:
public,private等关键词来修饰的。__两个下划线,那么这个函数或变量就Python中的私有成员了。name mangling 技术,将 __membername替换成 _classname__membername,所以你在类(对象)外部使用原来的私有成员的名字时,会提示找不到。