面向对象

Posted sun0618-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象相关的知识,希望对你有一定的参考价值。

一、学习总结

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)

 

技术图片

 

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

 

以上是关于面向对象的主要内容,如果未能解决你的问题,请参考以下文章

面向面试编程代码片段之GC

PHP面向对象之选择工厂和更新工厂

Java中面向对象的三大特性之封装

python之路之前没搞明白4面向对象(封装)

Scala的面向对象与函数编程

Python面向对象学习之八,装饰器