Python封装及实现方法
2022/5/3 20:15:05
本文主要是介绍Python封装及实现方法,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
什么是封装?
- 在设计类时,刻意地将一些属性和方法隐藏在类的内部,这样在使用此类时,将无法直接以“类对象.属性名”(或者“类对象.方法名(参数)”)的形式调用这些属性(或方法),而只能用未隐藏的类方法间接操作这些隐藏的属性和方法。封装绝不是将类中所有的方法都隐藏起来,一定要留一些像键盘、鼠标这样可供外界使用的类方法。
封装的好处是什么?
-
封装机制保证了类内部数据结构的完整性,因为使用类的用户无法直接看到类中的数据结构,只能使用类允许公开的数据,很好地避免了外部对内部数据的影响,提高了程序的可维护性。
-
一个类实现良好的封装,用户只能借助暴露出来的类方法来访问数据,我们只需要在这些暴露的方法中加入适当的控制逻辑,即可轻松实现用户对类中属性或方法的不合理操作。
-
对类进行良好的封装,还可以提高代码的复用性。
Python 类如何封装?
- Python 类中的变量和函数,不是公有的(类似 public 属性),就是私有的(类似 private),这 2 种属性的区别如下:
1. public:公有属性的类变量和类函数,在类的外部、类内部以及子类中,都可以正常访问; 2. private:私有属性的类变量和类函数,只能在本类内部使用,类的外部以及子类都无法使用。
- 默认情况下,Python 类中的变量和方法都是公有(public)的,它们的名称前都没有下划线 “_”,如果类中的变量和函数,其名称以双下划线“__”开头,则该变量(函数)为私有变量(私有函数),其属性等同于 private。
- 除此之外,还可以定义以单下划线“_”开头的类属性或者类方法(例如 _name、_display(self)),这种类属性和类方法通常被视为私有属性和私有方法,虽然它们也能通过类对象正常访问,但这是一种约定俗称的用法,初学者一定要遵守。
例如,如下程序示范了 Python 的封装机制:
class Students: def set_name(self, name): if len(name) < 3: raise ValueError('名称长度必须大于3!') self.__name = name def get_name(self): return self.__name name = property(get_name, set_name) # 为 name 配置 setter 和 getter 方法 def set_add(self, add): if add.startswith("http://"): self.__add = add else: raise ValueError('地址必须以 http:// 开头') def get_add(self): return self.__add add = property(get_add, set_add) # 为 add 配置 setter 和 getter 方法 # 定义个私有方法 def __display(self): print(self.__name, self.__add) student = Students() student.name = "大切切" student.add = "http://www.cnblogs.com/bigcarcar" print(student.name) print(student.add) ###运行结果 大切切 http://www.cnblogs.com/bigcarcar
-
上面程序中,Students 将 name 和 add 属性都隐藏了起来,但同时也提供了可操作它们的“窗口”,也就是各自的 setter 和 getter 方法,这些方法都是公有(public)的。
-
通过此程序的运行逻辑不难看出,通过对 Students 类进行良好的封装,使得用户仅能通过暴露的 setter() 和 getter() 方法操作 name 和 add 属性,而通过对 setname() 和 setadd() 方法进行适当的设计,可以避免用户对类中属性的不合理操作,从而提高了类的可维护性和安全性。
其中__display()为该类私有(private)方法,且该类没有提供操作该私有方法的“窗口”,因此我们无法在类的外部使用它。如下调用 __display() 方法是不可行的
student.__display() # 发起调用 ### 返回报错 Traceback (most recent call last): File "tests.py", line 68, in <module> student.__display() AttributeError: 'Students' object has no attribute '__display'
封装原理详解
- 事实上,Python 封装特性的实现纯属“投机取巧”,之所以类对象无法直接调用以双下划线开头命名的类属性和类方法,是因为其底层实现时,Python 偷偷改变了它们的名称。
事实上,对于以双下划线开头命名的类属性或类方法,Python 在底层实现时,将它们的名称都偷偷改成了 "_类名__属性(方法)名" 的格式。
### 用下列方式可以访问到类中的私有属性 student._Students__display() print(student._Students__name) print(student._Students__add) ### 运行结果: 大切切 http://www.cnblogs.com/bigcarcar 大切切 http://www.cnblogs.com/bigcarcar
甚至于,我们还可以通过这种方式修改 student 对象的私有属性,例如:
### 修改对象私有属性 student._Students__name = '麻花藤' student._Students__add = 'www.qq.com' print(student._Students__name) print(student._Students__add) ### 运行结果: 麻花藤 www.qq.com
总结
Python 类中所有的属性和方法,都是公有(public)属性,如果希望 Python 底层修改类属性或者类方法的名称,以此将它们隐藏起来,只需将它们的名称前添加双下划线(“__”)即可。
这篇关于Python封装及实现方法的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-25Python编程基础:变量与类型
- 2024-11-25Python编程基础与实践
- 2024-11-24Python编程基础详解
- 2024-11-21Python编程基础教程
- 2024-11-20Python编程基础与实践
- 2024-11-20Python编程基础与高级应用
- 2024-11-19Python 基础编程教程
- 2024-11-19Python基础入门教程
- 2024-11-17在FastAPI项目中添加一个生产级别的数据库——本地环境搭建指南
- 2024-11-16`PyMuPDF4LLM`:提取PDF数据的神器