zoukankan      html  css  js  c++  java
  • 面向对象

    一、学习总结

    1、面向对象的三要素

    1》封装

    封装是从业务逻辑中抽象对象时,要赋予对象相关数据与操作,将一些数据和操作打包在一起的过程。封装是使用对象的主要魅力之一,它提供了一个简单方法来创建复杂方案,解决了世界是如何工作的这一问题.我们自然的认为周围的世界是由相互作用的对象组成,每个对象都有自己相关的数据,并能完成一定的功能,从设计的角度来看,封装还提供了一个重要的服务,它分开了是什么和怎么做这两个问题。对象的实现与使用是相互独立的,封装的另外一个优势是支持代码复用,它可以将常用功能以组件方式打包起来。


    2》多态
    多态意味着多种形式,当用面向对象时,它是指对象是怎么回应一个依赖于对象类型或种类的消息。多态的作用是让程序在不同情况下用一个函数名启用不同的方法。

    多态举例:在屏幕上有一个图形对象列表objects,包括circle,rectangle,polygon等,使用相同的代码,可以画出列表中所有的图形:
    for obj in objects:
    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面向对象程序设计的3个特点:封装,多态,继承。

     2、Python中以下划线开头的变量名的特点

    Python核心风格:避免用下划线作为变量名的开始。

    因为下划线对解释器有特殊的意义,而且是内建标识符所使用的符号,我们建议程序员避免用下划线作为变量名的开始。一般来讲,变量名_xxx被看作是私有的,在模块或类外不可以使用。当变量是私有的时候,用_xxx 来表示变量是很好的习惯。因为变量名__xxx__对Python 来说有特殊含义,对于普通的变量应当避免这种命名风格。

     "单下划线"

     "单下划线开始的成员变量叫做保护变量,意思是只有类对象和自类对象自己能访问到这些变量。

    例子:以单下划线开头(_foo)的代表不能直接访问的类属性,需通过类提供的接口进行访问,不能用“from xxx import *”而导入。

     "双下划线"

    "双下划线开始的是私有成员,意思是只有类对象自己能访问,连子类对象也不能访问到这个数据。

     例子:以双下划线开头的(__foo)代表类的私有成员;以双下划线开头和结尾的(__foo__)代表python里特殊方法专用的标识,如 __init__()代表类的构造函数。

     

    3、共有成员和私有成员

    Python并没有对私有成员提供严格的访问保护机制

    在定义类的成员时,如果成员名以两个下划线“__”或更多下划线开头而不以两个或更多下划线结束则表示是私有成员。

    私有成员在类的外部不能直接访问,需要通过调用对象的公开成员方法来访问,也可以通过Python支持的特殊方式来访问。

    公开成员既可以在类的内部进行访问,也可以在外部程序中使用。

     

    在IDLE环境中,在对象或类名后面加上一个圆点“.”,稍等一秒钟则会自动列出其所有公开成员,模块也具有同样的用法。

    如果在圆点“.”后面再加一个下划线,则会列出该对象、类或模块的所有成员,包括私有成员

     

     4、定义方法

    在类中定义的方法可以粗略分为四大类:公有方法、私有方法、静态方法和类方法。

    公有方法、私有方法都属于对象,私有方法的名字以两个下划线“__”开始,每个对象都有自己的公有方法和私有方法,在这两类方法中可以访问属于类和对象的成员;

    公有方法通过对象名直接调用,私有方法不能通过对象名直接调用,只能在属于对象的方法中通过self调用或在外部通过Python支持的特殊方式来调用。 如果通过类名来调用属于对象的公有方法,需要显式为该方法的self参数传递一个对象名,用来明确指定访问哪个对象的数据成员。

    静态方法和类方法都可以通过类名和对象名调用,但不能直接访问属于对象的成员,只能访问属于类的成员。 静态方法可以没有参数。 一般将cls作为类方法的第一个参数名称,但也可以使用其他的名字作为参数,并且在调用类方法时不需要为该参数传递值。

     

    二,三维向量

     1 class vector3:
     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, obj): #重载+作为加号
     7   return vector3(self.x+obj.x, self.y+obj.y, self.z+obj.z)
     8  def __sub__(self, obj): #重载-作为减号
     9   return vector3(self.x-obj.x, self.y-obj.y, self.z-obj.z)
    10  def __mul__(self, obj): #重载*作为点乘
    11   return vector3(self.x*obj.x, self.y*obj.y, self.z*obj.z)
    12  def __pow__(self, obj): #重载**作为叉乘。不好,偏离了常理上的意义,可以考虑重载其他符号,或者直接写函数。
    13   return vector3(self.y*obj.z-obj.y*self.z, self.z*obj.x-self.x*obj.z, self.x*obj.y-obj.x*self.y)
    14  def __str__(self): #供print打印的字符串
    15   return str(self.x)+','+str(self.y)+','+str(self.z)
    16 v1 = vector3(1, 2, 3)
    17 v2 = vector3(0, 1, 2)
    18 print (v1 + v2)
    19 print (v1 - v2)
    20 print (v1 * v2)
    21 print (v1 ** v2)

     三、编写一个程序(类),用户输入一段英文,然后输出这段英文中所有长度为三个字母的单词,并且如果单词有连续重复了两次,只输出一个【例如:This is is a desk,程序输出 This is  a desk】。

    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)

    到这里就结束啦啦啦啦啦啦啦

  • 相关阅读:
    python数据分析之pandas库的Series应用
    LINUX学习
    DBA日常SQL之查询数据库运行状况
    使用RMAN从磁带库恢复归档文件
    PHP系列 | PHPexcel导入xls格式 ,提示错误:iconv(): Wrong charset, conversion from `CP936' to `UTF-8' is not allowed
    工具系列 | 使用Lodop进行WEB打印程序开发
    PHP系列 | 编译安装msgpack-php
    Nginx系列 | [转]Nginx 上传文件:client_max_body_size 、client_body_buffer_size
    PHP系列 | Session 存储在Redis
    PHP系列 | PHP5.6 安装 endroid/qr-code 遇到的问题
  • 原文地址:https://www.cnblogs.com/sun0618-/p/10714316.html
Copyright © 2011-2022 走看看