学校资源网站建设,做教育网站用什么颜色,南阳做网站优化公司,建站软件2017本章学习链接如下#xff1a;
Python 面向对象——1.基本概念
Python 面向对象——2.类与对象实例属性补充解释#xff0c;self的作用等
Python 面向对象——3.实例方法#xff0c;类方法与静态方法
Python 面向对象——4.继承
Python 面向对象——5.多态
1. 封装的基…本章学习链接如下
Python 面向对象——1.基本概念
Python 面向对象——2.类与对象实例属性补充解释self的作用等
Python 面向对象——3.实例方法类方法与静态方法
Python 面向对象——4.继承
Python 面向对象——5.多态
1. 封装的基本概念
封装是将属性和方法结合在一起的机制同时限制对对象内部实现的直接访问。在Python中封装通常是通过定义类和使用私有变量以双下划线开头来实现的。封装的主要目的是隐藏对象的内部状态和复杂性只暴露出一个清晰和简洁的接口供外部代码使用。
1私有变量
私有变量是一种访问限制机制用于限制类外部对类内部属性或方法的直接访问。
命名约定在Python中私有变量通常以两个下划线_ _开头。例如_ _my_variable。那这是怎样做到的呢源于Python中的名称重整机制。
2名称重整规则 如果属性名以双下划线开头但不以下划线结尾_ _name那么在名称重整时会将属性名中的双下划线替换为类名然后再加上一个单下划线。例如对于类MyClass中的属性_ _my_variable重整后的名称将是_MyClass_ _my_variable。 如果属性名以双下划线开头并且以下划线结尾_ _my_variable_ _那么在名称重整时会保留一个下划线在属性名的开头和结尾。例如对于类MyClass中的属性_ _my_variable_ _重整后的名称将是 _MyClass_ _my_variable_ _。
我们看下面这个代码示例self._ _salary 是一个私有属性它被声明为私有的因为它的名称以双下划线开头。根据名称重整规则这个属性在类外部的名称将变为 _Employee_ _salary。self._ _top_secret() 是一个私有方法同样因为以双下划线开头它在类外部的名称将变为 _Employee_ _top_secret。当我们尝试直接访问这些私有成员时Python解释器会抛出一个 AttributeError因为它找不到这些属性或方法。然而如果我们知道了名称重整后的名称我们仍然可以访问到这些私有成员但这违反了封装的原则因此通常不推荐这样做。
请注意尽管我们可以通过名称重整后的名称访问私有成员但这并不是Python推崇的做法。更好的做法是通过类的公有接口如方法来访问或修改私有成员以保持类的封装性。
class Employee:def __init__(self, name):self.name name # 公开属性self.__salary 50000 # 私有属性使用双下划线开头def give_raise(self, amount):self.__salary amountprint(f{self.name}s new salary is: ${self.__salary})def __top_secret(self):pass # 私有方法使用双下划线开头# 创建Employee类的实例
emp Employee(Alice)# 尝试直接访问私有属性这将不会成功
try:print(emp.__salary) # 错误__salary不是Employee的属性
except AttributeError as e:print(e)# 尝试调用私有方法这也将不会成功
try:emp.__top_secret() # 错误__top_secret不是Employee的方法
except AttributeError as e:print(e)# 使用公开方法访问私有属性
print(f{emp.name}s salary is: ${emp._Employee__salary}) 请注意名称重整并不是真正的私有化而是一种约定。它通过名称改写来减少属性被外部访问的可能性但并不阻止有经验的程序员绕过这个机制。在Python中如果你想要完全私有的属性可以使用单下划线开头的属性名_my_variable但这只是一种约定表示该属性不应该被外部直接访问。
3try:
try和except语句用于异常处理。当你执行一个可能会抛出异常的代码段时可以将该段代码放在try块中。如果在try块中的代码执行过程中发生了异常程序的执行将不会立即停止而是会跳转到except块中这允许你捕获并处理异常。
在这段代码示例中try块用于尝试访问Employee类的私有属性_ _salary和调用私有方法_ _top_secret。根据Python的命名规则以双下划线开头的属性和方法对外部是不可访问的因为它们被视为私有的尽管这不是一种真正的私有机制只是一种命名约定。
代码中的两个try块尝试执行如下操作 尝试直接访问emp实例的私有属性_ _salary。由于_ _salary是私有的这个尝试会抛出AttributeError因为_ _salary不是Employee实例的公开属性。 尝试调用emp实例的私有方法_ _top_secret。同样由于_ _top_secret是私有的这个尝试也会抛出AttributeError。
2.错误捕获
1背后的原理
except AttributeError as e:print(e) 当AttributeError被捕获时变量e是一个异常对象。这个对象包含了异常的详细信息当你打印e时实际上是调用了该对象的__str__()方法它返回异常的描述性字符串。
当你打印一个异常对象时背后实际上是调用了该对象的__str__()方法。这是Python对象的内置特殊方法也称为dunder方法即双下划线前缀和后缀的方法用于返回对象的字符串表示形式。即使在给定的类定义中没有显式地看到__str__()方法它也是隐式存在的因为所有的Python对象默认继承自object类而object类提供了一个默认的__str__()实现。
异常类如AttributeError通常会重写__str__()方法以返回一个描述错误的字符串。当你执行print(e)Python首先查找对象e的__str__()方法并调用它来获取字符串表示然后打印出来。
这是Python中所有异常对象的标准行为所以即使你在类定义中没有看到显式的__str__()方法当你打印异常对象时它也是可用的。
下面是一个简单的示例展示如何自定义一个类并重写__str__()方法
在上面的代码中我们创建了一个自定义异常MyError它继承自Python的基类Exception。我们重写了__str__()方法来返回一个自定义的错误信息。当异常被捕获并打印时会显示我们提供的信息。
class MyError(Exception):def __str__(self):return 自定义错误信息try:raise MyError()
except MyError as e:print(e) # 输出: 自定义错误信息 2Exception类
Python的Exception类是所有内置和用户定义的异常的基类。它位于异常类继承层次结构的顶端提供了处理异常时的默认行为。在Python中异常是用于错误处理的一种机制允许程序在发生错误时从代码的某个部分“跳出”并提供一种方式来响应或恢复。