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


    一、面向对象学习总结

    面向对象的三个要素:

    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'[a-zA-Z]{3}')
     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,往下一次增加

     

  • 相关阅读:
    亲手使用Sencha Touch + phonepag开发Web APP随笔 -- 第一个APP
    亲手使用Sencha Touch + phonepag开发Web APP随笔 -- 环境安装篇
    安装Ruby下的compress失败
    Centos 6.5安装bugzilla 5.0.2
    Win7+Eclipse+Hadoop2.6.4开发环境搭建
    [整理]Centos6.5 + hadoop2.6.4环境搭建
    js 使用技巧
    css 样式小窍门
    fpm rpm制作
    nginx rewrite
  • 原文地址:https://www.cnblogs.com/ReganWhite/p/10727236.html
Copyright © 2020-2023  润新知