2019-04-15 Python中的面向对象学习总结
一.面向对象总结:
(1)三要素:封装,继承,多态 详细介绍链接:https://www.jianshu.com/p/68ab35298a59
one.封装:所谓封装,也就是把 客观事物 封装成 抽象的 类,并且 类 可以把自己的数据和方法只让可信的类或者对象操作。 简而言之就是将内容封装到某个地方,以后再去调用被封装在某处的内容
测试代码:
#封装测试例子 class Foo:#定义一个类 def __init__(self,name,age): #称为构造方法,根据类创建对象时自动执行 self.name = name #name和age是对象的 属性 self.age = age def detail(self): print(self.name) print(self.age) obj.Foo('wupeiqi',18) obj.detail() >>>>输出结果 wupeiqi 17
two.继承:将多个类共有方法提取到父类,子类仅需继承父类而不必一一实现每个方法 注:除了子类和父类的称谓,你可能看到过 派生类 和 基类 ,他们与子类和父类只是叫法不同而已。
测试代码:
class Foo: def __init__(self,name,age): self.name = name self.age = age def detail(self): print(self.name) print(self.age) class son(Foo):#子类继承父类,即拥有了父类的所有方法 pass obj = son('wupeiqi',17) obj.detail() 》》》输出结果wupeiqi 17
需要说明的是:python可以继承多个类,如果python继承了多个类那么它有两种方式寻找,分别是 深度优先和广度优先。以后再作详细介绍
three.多态:所谓多态就是指一个类实例的 相同方法 在不同情形有不同 表现形式
(2)类成员的修饰符:下划线
xxx :公有成员,在任何地方都能访问
__xxx or ...__xxx:私有成员,只有类对象自己能访问,子类对象不能直接访问,但在对象外部可以通过“对象名._类名__xxx”这样的特殊方式来访问。
_xxx:受保护成员,不能用'from module import *'导入
__xxx__:系统定义的特殊成员
注:Python中不存在严格意义上的私有成员
(3)名词解析
1. 类:类就是一个模板,模板里可以包含多个函数,每个函数都能实现一些功能。
2. 对象:根据模板(类)创建的实例,通过这个实例(对象)可以执行类中的函数。
3. 属性:类中所定义的变量
4. 方法:类中所定义的函数
5. 实例化:通过类创建对象的过程
总结:对象的抽象是类,类的具体化就是对象;也可以说类的实例化是对象,对象是类的实例,例如 奥斑马和梅西可以抽象为人(类),人的实例化是奥斑马和梅西,此外,类也可以作为 其父类的实例化,例如:人和猫可以抽象为动物,动物的实例化是人和猫。
(4)类的成员:字段,方法,属性
注:类和对象在内存中如何保存?
答:类以及类中的方法在内存中只占一份内存,而根据类创建的每一个对象在内存中都需要一份内存。如下图:
one.字段:分为普通字段和静态字段(本质区别是在内存中保存的位置不同)。注意:在所有成员中,只有字段中的普通字段保存于对象中,因此创建多少个对象在内存中就有几个普通字段;而其他成员都保存在类中,也只占用一份内存空间。
two.方法:普通方法,静态方法和类方法,三种方法在内存中都归属于类,区别在于调用方法不同。
1.
2.
3.
4.
three.属性 其实是普通方法的变种
(5)类的特殊成员
(1) __init__:构造方法,通过类创建对象时,自动触发执行。
(2) __del__:析构方法,当对象在内存中被释放时,自动触发执行,此方法一般无需定义。
(3) 类的属性
dir(类名):查出的是一个名字列表
类名.__dict__:查出的是一个字典,key为属性名,value为属性值
(4) 特殊的类属性
类名.__name__:类的名字(字符串)
类名.__doc__:类的文档字符串
类名.__base__:类的第一个父类(在讲继承时会讲)
类名.__bases__:类所有父类构成的元组(在讲继承时会讲)
类名.__dict__:类的字典属性
类名.__module__:类定义所在的模块
类名.__class__:实例对应的类(仅新式类中)
(6)self
在Python中,在类中定义实例方法时将第一个参数定义为“self”只是一个习惯,而实际上类的实例方法中第一个参数的名字是可以变化的,而不必须使用“self”这个名字,尽管如此,建议编写代码时仍以self作为方法的第一个参数名字。
>>> class A: def __init__(hahaha, v): hahaha.value = v def show(hahaha): print(hahaha.value) >>> a = A(3) >>> a.show() 3
(7)混入机制
# -*- encoding:utf-8 -*- ''' 实例说明 —— 混入机制 ''' import types class Stu: #定义类 where = 'China' #定义类属性,属于静态字段,只保存于类中 def __init__(self, c): self.name = c #定义实例属性 stu = Stu("wupeiqi") #实例化对象 print(stu.name, Stu.where) #查看实例属性和类属性的值 Stu.where = 'Guangdong' #修改类属性的值 Stu.age = 18 #动态增加类属性,属于静态字段,只保存于类中 stu.name = "woshiname" #修改实例属性的值 print(Stu.where, Stu.age, stu.name) def setGender(self, s): self.Gender = s stu.setGender = types.MethodType(setGender, stu) #动态增加成员方法 stu.setGender('boy') #调用成员方法 print(stu.Gender) #利用特殊的类属性查看类与对象的属性与行为 print("Stu类的属性与行为如下:\n",Stu.__dict__) #字典属性 print("\n") print("stu对象的属性与行为如下:\n",stu.__dict__) 》》》输出如下
wupeiqi China
Guangdong 18 woshiname
boy
Stu类的属性与行为如下:
{'__module__': '__main__', 'where': 'Guangdong', '__init__': <function Stu.__init__ at 0x000002CDD020A9D8>, '__dict__': <attribute '__dict__' of 'Stu' objects>, '__weakref__': <attribute '__weakref__' of 'Stu' objects>, '__doc__': None, 'age': 18}
stu对象的属性与行为如下:
{'name': 'woshiname', 'setGender': <bound method setGender of <__main__.Stu object at 0x000002CDD0224320>>, 'Gender': 'boy'}
二.面向对象例子
First.三维向量类
(1).实现向量的增减乘除
代码如下:
class vecter3: def __init__(self,x=0,y=0,z=0): self.x = x self.y = y self.z = z def __add__(self,n): # + __add__意味着+号,系统自动识别 return vecter3(self.x+n.x, self.y+n.y, self.z+n.z) def __sub__(self,n): return vecter3(self.x-n.x, self.y-n.y, self.z-n.z) def __mul__(self,n): return vecter3(self.x*n, self.y*n, self.z*n) def __truediv__(self, n): return vecter3(self.x/n, self.y/n, self.z/n) def __str__(self): ##供print打印的字符串 return str(self.x)+','+str(self.y)+','+str(self.z) if __name__ == "__main__": n = int (input("请输入一个变量n:")) a,b,c = map(int,input("请输入第一个向量:").split()) v1 = vecter3(a,b,c) a,b,c = map(int,input("请输入第二个向量:").split()) v2 = vecter3(a,b,c) print("两向量的加法:",v1 + v2) print("两向量的减法:",v1 - v2) print("标量与向量的乘法:",v1 * n) print("标量与向量的除法:",v1 / n)
(2)if __name__ == '__main__' 如何正确理解
详细介绍链接:http://blog.konghy.cn/2017/04/24/python-entry-program/
Second.字符串处理
(1)简述:用户输入一段英文,得到这段英文中所以长度为x(用户输入)的单词,并去除重复的单词。
代码如下(分词法):
# -*- encoding:utf-8 -*- ''' 将一段英文中长度为x的单词输出,并去掉重复的单词 ''' import jieba class proString: Str = "" Dict = {} #花括号{}:代表dict字典数据类型,字典是Python中唯一内建的映射类型 Ls = [] #中括号[]:代表list列表数据类型,列表是一种可变序列 def __init__(self,string,length): #初始化长度固定 self.string = string self.length = length def SignalWord(self): #去除重复的单词 self.words = jieba.lcut(self.string) #jieba分词,精确模式返回一个列表 如:['I', ' ', 'a', 'good'] #print(self.words) for i in self.words: #与词频算法相似 self.Dict[i] = self.Dict.get(i,0) + 1 #字典的运用 .get(<key>.<default>)统计词频P167 print(self.Dict) #查看字典 {'I': 2, ' ': 6, 'am': 1, 'a': 1, 'good': 1, 'boy': 1, '!': 1} del(self.Dict[' ']) #删除空格项 print(self.Dict) #查看删除空格后的字典 {'I': 2, 'am': 1, 'a': 1, 'good': 1, 'boy': 1, '!': 1} self.Ls = list(self.Dict.keys()) #字典类型转化成列表类型 print(self.Ls) #查看列表 ['I', 'am', 'a', 'good', 'boy', '!'] def StubbenWord(self): #利用去除重复的单词,得到固定长度的单词 for i in self.Ls: if len(i) == self.length: self.Str += i +' ' #加空格分隔 return self.Str if __name__ == "__main__": str1 = input("请输入字符串:") n = eval(input("请输入固定单词长度:")) Po = proString(str1,n) Po.SignalWord() print("处理后的字符串为:" + Po.StubbenWord())
(2)正则表达式法:
代码如下:
import re class proString: Dict = {} #定义一个字典类型数据 Ls = [] #列表 静态变量 全局可用 def __init__(self,string,length): self.string = string self.length = length def Fixed_length_word(self): self.words = re.findall(r'\b[a-z/A-Z]{%s}\b'%self.length,self.string) #print(self.words) #输出为 ['Boy', 'Boy', 'boy', 'BOY'] 有重复 for i in self.words: self.Dict[i] = self.Dict.get(i,0) +1 #单词变为 字典类型数据 self.Ls = list(self.Dict.keys()) #提取字典中在keys位置的单词(相当于去重复) #print(self.Ls) #输出为 ['Boy', 'boy', 'BOY'] Str = "" #定义一个字符串 for i in self.Ls: #把上面的列表转换为字符串 Str += i + ' ' #用空格分隔 return Str if __name__ == "__main__": str = "I I am a good Boy Boy boy BOY!" leng = eval(input("请输入固定单词长度:")) Po = proString(str,leng) print("处理后的字符串为:"+Po.Fixed_length_word())
2019-04-15 Python中的面向对象学习总结的更多相关文章
- python中的面向对象学习以及类的封装(这篇文章初学者一定要好好看)
这篇文章对于初学者可以很有效的理解面对过程.面对对象 一.首先介绍一下面向过程和面向对象的比较: 面向过程 VS 面向对象 编程范式 编程是程序员用特定的语法+数据结构+算法组成的代码来告诉计算机如何 ...
- python中的面向对象学习以及类的多态
接下来类的第三个重要的特性:多态(一种接口,多种实现) 多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特 ...
- python中的面向对象学习以及类的继承和继承顺序
继承 首先编写一串关于类的代码行: __author__ = "Yanfeixu" # class People: 经典类不用加(object) class People(obje ...
- python中的面向对象学习之继承实例讲解
__author__ = "Yanfeixu" class School(object): # object是基类,所有的类都是继承这个--新式类 def __init__(sel ...
- Python中字符串的学习
Python中字符串的学习 一.字符串的格式化输出 % 占位符 %s 字符串 %d integer %x 十六进制 integer %f float 指定长度 %5d 右对齐,不足左边补空格 %-5d ...
- python中confIgparser模块学习
python中configparser模块学习 ConfigParser模块在python中用来读取配置文件,配置文件的格式跟windows下的ini配置文件相似,可以包含一个或多个节(section ...
- 22.python中的面向对象和类的基本语法
当我发现要写python的面向对象的时候,我是踌躇满面,坐立不安呀.我一直在想:这个坑应该怎么爬?因为python中关于面向对象的内容很多,如果要讲透,最好是用面向对象的思想重新学一遍前面的内容.这个 ...
- 面向对象相关概念与在python中的面向对象知识(魔法方法+反射+元类+鸭子类型)
面向对象知识 封装 封装的原理是,其成员变量代表对象的属性,方法代表这个对象的动作真正的封装是,经过深入的思考,做出良好的抽象(设计属性时用到),给出“完整且最小”的接口,并使得内部细节可以对外透明( ...
- python学习之【第十七篇】:Python中的面向对象(类和对象)
1.什么是类和类的对象? 类是一种数据结构,我们可以用它来定义对象,后者把数据值和行为特性融合在一起,类是现实世界的抽象的实体以编程形式出现.实例是这些对象的具体化.类是用来描述一类事物,类的对象指的 ...
随机推荐
- sort排序用法
Python] sorted函数 我们需要对List.Dict进行排序,Python提供了两个方法对给定的List L进行排序,方法1.用List的成员函数sort进行排序,在本地进行排序,不返回副本 ...
- VICA 架构设计
本文记录最近完成的一个通用实时通信客户端的架构. 背景 我们公司是做税务相关的软件,有针对大客户 MIS 系统,也有针对中小客户的 SaaS 平台.这些系统虽然都是 B/S 的,但是也需要使用 Act ...
- docker 中打包部署Springboot项目
1.安装jdk yum -y install java-1.8.0-openjdk* 2.安装并启动mysql mysql高版本驱动变了,最后还是安装5.6 docker pull mysql:5.6 ...
- 关闭IIS开启自启
关闭IIS开启自启 win+R输入services.msc 找到服务名称为World Wide Web Publishing Service 双击停止,右键禁用
- 即将上线的Imcash是何方神圣?
区块链的诞生,让数字资产来到这个时代,每个人的财产分布又多了一种十分重要的选择. 当下每个人最需要的就是一款优秀的数字资产管理平台,目前市面上各种平台层出不穷,在线管理.离线管理.全节点钱包.轻钱包. ...
- 一个div实现白眼效果
巧妙利用border和background-clip <div class="eye"></div> .eye{ width:150px; height ...
- 动态sql与静态sql的区别
首先,所谓SQL的动态和静态,是指SQL语句在何时被编译和执行,二者都是用在SQL嵌入式编程中的,这里所说的嵌入式是指将SQL语句嵌入在高级语言中,而不是针对于单片机的那种嵌入式编程. 静态SQL,在 ...
- DPI与DFI技术分析
DPI全称为“Deep Packet Inspection”,称为“深度包检测”.DPI技术在分析包头的基础上,增加了对应用层的分析,是一种基于应用层的流量检测和控制技术,当IP数据包.TCP或UDP ...
- LOJ.2865.[IOI2018]狼人(Kruskal重构树 主席树)
LOJ 洛谷 这题不就是Peaks(加强版)或者归程么..这算是\(IOI2018\)撞上\(NOI2018\)的题了? \(Kruskal\)重构树(具体是所有点按从小到大/从大到小的顺序,依次加入 ...
- sybase central 报 NullPointerException 解决
准备发布版本,但是要创建数据库的时候遇到了问题,发现之前可以正常打开的sybase Central 现在无法打开了.苦恼一段时间后找到如下解决方法. 报错如下: 解决如下: 正常打开: