面向对象
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)
到这里就结束啦啦啦啦啦啦啦
以上是关于面向对象的主要内容,如果未能解决你的问题,请参考以下文章