面向对象学习:类和正则表达(自动更正和代数运算)

一、面向对象学习总结

面向对象的三个要素:

 

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,往下一次增加

 

 

 

 

posted @ 2019-04-18 00:46  Regan_White_Lin  阅读(210)  评论(0编辑  收藏  举报