面向对象学习:类和正则表达(自动更正和代数运算)
一、面向对象学习总结
面向对象的三个要素:
1、封装
- 封装是从业务逻辑中抽象对象时,要赋予对象相关数据与操作,将一些数据和操作打包在一起的过程。封装是使用对象的主要魅力之一,它提供了一个简单方法来创建复杂方案,解决了世界是如何工作的这一问题,我们自然的认为周围的世界是由相互作用的对象组成,每个对象都有自己相关的数据,并能完成一定的功能,从设计的角度来看,封装还提供了一个重要的服务,它分开了是什么和怎么做这两个问题。对象的实现与使用是相互独立的,封装的另外一个优势是支持代码复用,它可以将常用功能以组件方式打包起来。
2、多态
- 多态意味着多种形式,当用面向对象时,它是指对象是怎么回应一个依赖于对象类型或种类的消息。多态的作用是让程序在不同情况下用一个函数名启用不同的方法。
- 多态举例:在屏幕上有一个图形对象列表objects,包括circle,rectangle,polygon等,使用相同的代码,可以画出列表中所有的图形:
1 for obj in objects:
2 obj.draw(win)
- 上述for循环,分别执行了circle.draw()方法,rectangle.draw()方法,polygon.draw()方法.
- 多态给予了面向对象系统极大的灵活性,对象可以用该对象应该用的方式来执行动作,如果没有面向对象,这种灵活性很难实现。
3、继承
- 一个类(subclass)可以继承另一个类(superclass).
- 举例:
建立一个系统以记录员工信息,需要一个Employee类,它包含所有员工都具有的一般信息,其中一个方法是homeAddress(),该方法可返回员工的住址信息。 员工分为正式员工(按月发工资)和临时员工(按天发工资),为正式员工定义一个MonthlyEmployee类(Employee类的子类),为临时员工定义一个 DaylyEmployee类(Employee类的子类),这两个子类都继承了Employee类,因此都有homeAddress()方法,然而,不同类型的员工,发工资的方法不同,正式员工有monthlyPay()方法,临时员工有daylyPay()方法。
- 继承的优点:1>建造系统中的类,避免重复操作,例如,我们不必为两个子类分别写一个homeAddress()方法,从Employee类继承即可。2>新类经常是基于已经存在的类,这样就可以提升代码的复用程度。
二、Python中以下划线开头的变量名特点
在Python中,以下划线开头的变量名有特殊的含义,尤其是在类的定义中。用下划线作为变量前缀和后缀来表示类的特殊成员:
l _xxx:这样的对象叫做保护变量,不能用'from module import *'导入,只有类对象和子类对象能访问这些变量;
l __xxx__:系统定义的特殊成员名字;
l __xxx:类中的私有成员,只有类对象自己能访问,子类对象也不能访问到这个成员,但在对象外部可以通过“对象名._类名__xxx”这样的特殊方式来访问。
Python中没有纯粹的C++意义上的私有成员。
三、设计一个三维向量类(实现向量的加法、减法以及向量与标量的乘法、除法)
代码如下
1 class Vecter3: 2 def __init__(self, x=0, y=0, z=0): 3 self.X = x 4 self.Y = y 5 self.Z = z 6 def __add__(self, n): 7 r = Vecter3() 8 r.X = self.X + n.X 9 r.Y = self.Y + n.Y 10 r.Z = self.Z + n.Z 11 return r 12 def __sub__(self, n): 13 r = Vecter3() 14 r.X = self.X - n.X 15 r.Y = self.Y - n.Y 16 r.Z = self.Z - n.Z 17 return r 18 def __mul__(self, n): 19 r = Vecter3() 20 r.X = self.X * n 21 r.Y = self.Y * n 22 r.Z = self.Z * n 23 return r 24 def __truediv__(self, n): 25 r = Vecter3() 26 r.X = self.X / n 27 r.Y = self.Y / n 28 r.Z = self.Z / n 29 return r 30 def __floordiv__(self, n): 31 r = Vecter3() 32 r.X = self.X // n 33 r.Y = self.Y // n 34 r.Z = self.Z // n 35 return r 36 def show(self): 37 print((self.X,self.Y,self.Z)) 38 v1 = Vecter3(1,2,3) 39 v2 = Vecter3(4,5,6) 40 v3 = v1+v2 41 v3.show() 42 v4 = v1-v2 43 v4.show() 44 v5 = v1*3 45 v5.show() 46 v6 = v1/2 47 v6.show()
四、自动更正
代码如下
1 import re 2 x = input(" input a string:") 3 pattern = re.compile(r'\b[a-zA-Z]{3}\b') 4 list1=pattern.findall(x) 5 list2 = sorted(set(list1), key=list1.index) 6 list2.sort(key=list1.index) 7 print(list2) 8 # compile函数根据包含的正则表达式的字符串创建模式对象。 9 #findall()返回的是括号所匹配到的结果 10 # list1.index决定项目在列表框中的位置,自上而下,第一个为0,往下一次增加