1。场景定义私有属性是指在Python的面向对象开发过程中,对象的一些属性,只想在对象内部使用,不想被外部访问。属性。即:私有属性是对象不愿意公开的属性。私有方法是指在Python面向对象开发的过程中,对象的一些方法或函数只想在对象内部使用,而不想在这些方法或函数之外被访问。即:私有方法是对象不想公开的方法或函数。2、语法定义Python中定义私有属性和私有方法的语法如下:"%s的工资是%d"%(self.s_name,self.__salary))(1).__salary是以两个下划线开头定义的私有属性。(2).__secret(self)是定义在两个下划线开头的私有方法。3.调用分析(1)。在__init__的对象初始化方法中,两个下划线开头定义的__salary属性是私有属性。现在在对象外调用__salary属性,看看私有属性是否可以正常访问。从上图的运行结果可以看出,在第11行,访问对象外部对象的私有属性__salary时,提示AttributeError错误,Staff对象zhangsan没有属性__salary。要证明Staff类对象确实有__salary实例属性,只是因为私有属性无法在对象外访问。我把self.__salary改成了:self.salary,__secret(self)方法引用了self.__salary属性,做了相应的修改,看到运行结果如下图。从运行结果可以看出,对外调用这个非私有属性是正常的,没有提示AttributeError错误。(2).在__secret(self)实例方法中,两个下划线开头定义的__secret(self)方法是私有方法。和上面的测试过程一样,先调用对象外的私有方法__secret(self),看私有方法是否能正常调用。从上图的运行结果可以看出,第11行,也就是访问对象外对象的私有方法__secret(self)时,提示AttributeError错误,而Staff对象zhangsan没有__secret方法。证明Staff类对象有实例方法__secret(self),只是因为私有方法不能在对象外访问。我把__secret(self)方法改成了:secret(self),其他代码不变。看到运行结果如下图所示。从运行结果可以看出,这个非私有方法的外部调用是正常的,没有提示AttributeError错误。(3).从下图可以看出,对象内部可以调用私有方法和私有属性。图中work方法调用私有方法__secret(self),私有方法__secret(self)调用私有属性__salary。使用对象外部的Staff类对象zhangsan调用work方法,可以间接访问对象的私有属性和私有方法。从控制台输出可以看出work方法可以正常访问对象内部定义的私有属性和私有方法。4、Python的伪私有属性和私有方法在Python中并不是真正的私有,因为Python在内部命名属性和方法时,对名称做了一些特殊处理,使得外界无法访问到相应的属性和方法。.以私有属性和私有方法为例,Python内部的处理方式有:(1)。属性:__salary,处理后的属性名称为:_Staff__salary(_班级名__属性名)(2)。Method:__secret,passed处理后的方法名是:_Staff__secret(_classname__methodname)知道了Python内部对私有属性和私有方法的处理,现在用这个处理后的命名方法访问对象外的私有属性和私有方法,看看你会不会可以正常访问。类Staff:def__init__(self,s_name,s_salary):self.s_name=s_nameself.__salary=s_salarydef__secret(self):return"%ssalaryis%d"%(self.s_name,self.__salary)zhangsan=Staff("张三",10000)print(zhangsan._Staff__salary)print(zhangsan._Staff__secret())运行结果如下图所示。控制台没有抛出任何异常,之前提示的AttributeError错误也没有了。这个例子证明Python并不是真正意义上的private。知道了它的内部处理方法后,仍然可以在对象外部使用_类名__属性名(方法名)的方法来访问对象内部定义的private。属性和私有方法。但是在日常工作中不推荐使用这种方法。由于在对象内部定义属性和方法时,声明为private,调用者需要遵守其规则。这里我只是想用这个小例子来说明Python并不是真正私有的。
