无锡网站制作哪家强,赣州市赣县区建设局网站,沧州网站推广,wordpress语言文件编辑事实上#xff0c;Python 封装特性的实现纯属“投机取巧”#xff0c;之所以类对象无法直接调用以双下划线开头命名的类属性和类方法#xff0c;是因为其底层实现时#xff0c;Python 偷偷改变了它们的名称。前面章节中#xff0c;我们定义了一个 CLanguage 类#xff0c…事实上Python 封装特性的实现纯属“投机取巧”之所以类对象无法直接调用以双下划线开头命名的类属性和类方法是因为其底层实现时Python 偷偷改变了它们的名称。前面章节中我们定义了一个 CLanguage 类定义如下class CLanguage :def setname(self, name):if len(name) 3:raise ValueError(名称长度必须大于3)self.__name namedef getname(self):return self.__name#为 name 配置 setter 和 getter 方法name property(getname, setname)def setadd(self, add):if add.startswith(http://):self.__add addelse:raise ValueError(地址必须以 http:// 开头)def getadd(self):return self.__add#为 add 配置 setter 和 getter 方法add property(getadd, setadd)#定义个私有方法def __display(self):print(self.__name,self.__add)注意在这个类中有一个 __display() 方法由于其是私有方法且该类没有提供任何调用该方法的“接口”因此在目前看来此方法根本无法在类外部调用。也就是说如下调用 __display() 方法是不可行的clang CLanguage()#尝试调用私有的 display() 方法clang.__display()这会导致如下错误Traceback (most recent call last):File D:\python3.6\1.py, line 33, in clang.__display()AttributeError: CLanguage object has no attribute __display那么是不是类似 display() 这种的私有方法真的没有方法调用吗如果你深入了解 Python 封装机制的底层实现原理就可以调用它。事实上对于以双下划线开头命名的类属性或类方法Python 在底层实现时将它们的名称都偷偷改成了 _类名__属性(方法)名 的格式。就以 CLanguage 类中的 __display() 为例Python 在底层将其方法名偷偷改成了“_CLanguage__display()”。例如在 CLanguage 类的基础上执行如下代码clang CLanguage()#调用name的setname()方法clang.name C语言中文网#调用add的setadd()方法clang.add http://c.biancheng.net#直接调用隐藏的display()方法clang._CLanguage__display()输出结果为C语言中文网 http://c.biancheng.net不仅如此那些原本我们认为是私有的类属性(例如 __name 和 __add)其底层的名称也改成了“_类名__属性名”的这种格式。例如clang CLanguage()clang.name C语言中文网clang.add http://c.biancheng.net#直接调用 name 和 add 私有属性print(clang._CLanguage__name,clang._CLanguage__add)运行结果为C语言中文网 http://c.biancheng.net甚至于我们还可以通过这种方式修改 clang 对象的私有属性例如clang._CLanguage__name Python教程clang._CLanguage__add http://c.biancheng.net/pythonprint(clang._CLanguage__name,clang._CLanguage__add)输出结果为Python教程 http://c.biancheng.net/python总结Python 类中所有的属性和方法都是公有(public)属性如果希望 Python 底层修改类属性或者类方法的名称以此将它们隐藏起来只需将它们的名称前添加双下划线(“__”)即可。