python 学习分享-面向对象
好激动,学了四个月的面向对象,我终于勉勉强强的把作业做完了,现在来重构我的面向对象的知识!
- 面向过程:根据业务逻辑从上到下写垒代码
- 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可
- 面向对象:对函数进行分类和封装,让开发“更快更好更强…”反正是类似于函数,但是比函数更牛逼
先看一段代码
- while True:
- if cpu利用率 > 90%:
- #发送邮件提醒
- 连接邮箱服务器
- 发送邮件
- 关闭连接
- if 硬盘使用空间 > 90%:
- #发送邮件提醒
- 连接邮箱服务器
- 发送邮件
- 关闭连接
- if 内存占用 > 80%:
- #发送邮件提醒
- 连接邮箱服务器
- 发送邮件
- 关闭连接
再看一段
- def 发送邮件(内容)
- #发送邮件提醒
- 连接邮箱服务器
- 发送邮件
- 关闭连接
- while True:
- if cpu利用率 > 90%:
- 发送邮件('CPU报警')
- if 硬盘使用空间 > 90%:
- 发送邮件('硬盘报警')
- if 内存占用 > 80%:
- 发送邮件('内存报警')
函数很好用啊!!!不用敲很多重复的代码,虽然我们是熟练工,但是能规避的还是要规避,毕竟农民伯伯都用机器了。
好啦,下面开始说正题了,比函数更牛逼,更好用的面向对象~~~~
- # 创建类
- class Foo:
- def Bar(self):
- print 'Bar'
- def Hello(self, name):
- print 'i am %s' %name
- # 根据类Foo创建对象obj
- obj = Foo()
- obj.Bar() #执行Bar方法
- obj.Hello('wupeiqi') #执行Hello方法
面向对象三大特性
面向对象的三大特性是指:封装、继承和多态。
先看封装:
- class Foo:
- def __init__(self, name, age):
- self.name = name
- self.age = age
- obj1 = Foo('wupeiqi', 18)
- print obj1.name # 直接调用obj1对象的name属性
- print obj1.age # 直接调用obj1对象的age属性
- obj2 = Foo('alex', 73)
- print obj2.name # 直接调用obj2对象的name属性
- print obj2.age # 直接调用obj2对象的age属性
- class Foo:
- def __init__(self, name, age):
- self.name = name
- self.age = age
- def detail(self):
- print self.name
- print self.age
- obj1 = Foo('wupeiqi', 18)
- obj1.detail() # Python默认会将obj1传给self参数,即:obj1.detail(obj1),所以,此时方法内部的 self = obj1,即:self.name 是 wupeiqi ;self.age 是 18
- obj2 = Foo('alex', 73)
- obj2.detail() # Python默认会将obj2传给self参数,即:obj1.detail(obj2),所以,此时方法内部的 self = obj2,即:self.name 是 alex ; self.age 是 78
好像很难理解的样子,但是多看,多写,多想,没难度!
- 练习一:在终端输出如下信息
- 小明,10岁,男,上山去砍柴
- 小明,10岁,男,开车去东北
- 小明,10岁,男,最爱大保健
- 老李,90岁,男,上山去砍柴
- 老李,90岁,男,开车去东北
- 老李,90岁,男,最爱大保健
- 老张...
- def kanchai(name, age, gender):
- print "%s,%s岁,%s,上山去砍柴" %(name, age, gender)
- def qudongbei(name, age, gender):
- print "%s,%s岁,%s,开车去东北" %(name, age, gender)
- def dabaojian(name, age, gender):
- print "%s,%s岁,%s,最爱大保健" %(name, age, gender)
- kanchai('小明', 10, '男')
- qudongbei('小明', 10, '男')
- dabaojian('小明', 10, '男')
- kanchai('老李', 90, '男')
- qudongbei('老李', 90, '男')
- dabaojian('老李', 90, '男')
- class Foo:
- def __init__(self, name, age ,gender):
- self.name = name
- self.age = age
- self.gender = gender
- def kanchai(self):
- print "%s,%s岁,%s,上山去砍柴" %(self.name, self.age, self.gender)
- def qudongbei(self):
- print "%s,%s岁,%s,开车去东北" %(self.name, self.age, self.gender)
- def dabaojian(self):
- print "%s,%s岁,%s,最爱大保健" %(self.name, self.age, self.gender)
- xiaoming = Foo('小明', 10, '男')
- xiaoming.kanchai()
- xiaoming.qudongbei()
- xiaoming.dabaojian()
- laoli = Foo('老李', 90, '男')
- laoli.kanchai()
- laoli.qudongbei()
- laoli.dabaojian()
- 练习二:游戏人生程序
- 1、创建三个游戏人物,分别是:
- 苍井井,女,18,初始战斗力1000
- 东尼木木,男,20,初始战斗力1800
- 波多多,女,19,初始战斗力2500
- 2、游戏场景,分别:
- 草丛战斗,消耗200战斗力
- 自我修炼,增长100战斗力
- 多人游戏,消耗500战斗力
- # -*- coding:utf-8 -*-
- # ##################### 定义实现功能的类 #####################
- class Person:
- def __init__(self, na, gen, age, fig):
- self.name = na
- self.gender = gen
- self.age = age
- self.fight =fig
- def grassland(self):
- """注释:草丛战斗,消耗200战斗力"""
- self.fight = self.fight - 200
- def practice(self):
- """注释:自我修炼,增长100战斗力"""
- self.fight = self.fight + 200
- def incest(self):
- """注释:多人游戏,消耗500战斗力"""
- self.fight = self.fight - 500
- def detail(self):
- """注释:当前对象的详细情况"""
- temp = "姓名:%s ; 性别:%s ; 年龄:%s ; 战斗力:%s" % (self.name, self.gender, self.age, self.fight)
- print temp
- # ##################### 开始游戏 #####################
- cang = Person('苍井井', '女', 18, 1000) # 创建苍井井角色
- dong = Person('东尼木木', '男', 20, 1800) # 创建东尼木木角色
- bo = Person('波多多', '女', 19, 2500) # 创建波多多角色
- cang.incest() #苍井空参加一次多人游戏
- dong.practice()#东尼木木自我修炼了一次
- bo.grassland() #波多多参加一次草丛战斗
- #输出当前所有人的详细情况
- cang.detail()
- dong.detail()
- bo.detail()
- cang.incest() #苍井空又参加一次多人游戏
- dong.incest() #东尼木木也参加了一个多人游戏
- bo.practice() #波多多自我修炼了一次
- #输出当前所有人的详细情况
- cang.detail()
- dong.detail()
- bo.detail()
继承
爸爸和儿子的关系~
- class 猫:
- def 喵喵叫(self):
- print '喵喵叫'
- def 吃(self):
- # do something
- def 喝(self):
- # do something
- def 拉(self):
- # do something
- def 撒(self):
- # do something
- class 狗:
- def 汪汪叫(self):
- print '喵喵叫'
- def 吃(self):
- # do something
- def 喝(self):
- # do something
- def 拉(self):
- # do something
- def 撒(self):
- # do something
- class 动物:
- def 吃(self):
- # do something
- def 喝(self):
- # do something
- def 拉(self):
- # do something
- def 撒(self):
- # do something
- # 在类后面括号中写入另外一个类名,表示当前类继承另外一个类
- class 猫(动物):
- def 喵喵叫(self):
- print '喵喵叫'
- # 在类后面括号中写入另外一个类名,表示当前类继承另外一个类
- class 狗(动物):
- def 汪汪叫(self):
- print '喵喵叫'
- class Animal:
- def eat(self):
- print "%s 吃 " %self.name
- def drink(self):
- print "%s 喝 " %self.name
- def shit(self):
- print "%s 拉 " %self.name
- def pee(self):
- print "%s 撒 " %self.name
- class Cat(Animal):
- def __init__(self, name):
- self.name = name
- self.breed = '猫'
- def cry(self):
- print '喵喵叫'
- class Dog(Animal):
- def __init__(self, name):
- self.name = name
- self.breed = '狗'
- def cry(self):
- print '汪汪叫'
- # ######### 执行 #########
- c1 = Cat('小白家的小黑猫')
- c1.eat()
- c2 = Cat('小黑的小白猫')
- c2.drink()
- d1 = Dog('胖子家的小瘦狗')
- d1.eat()
所以,对于面向对象的继承来说,其实就是将多个类共有的方法提取到父类中,子类仅需继承父类而不必一一实现每个方法。
注:除了子类和父类的称谓,你可能看到过 派生类 和 基类 ,他们与子类和父类只是叫法不同而已。
- class Animal:
- def eat(self):
- print "%s 吃 " %self.name
- def drink(self):
- print "%s 喝 " %self.name
- def shit(self):
- print "%s 拉 " %self.name
- def pee(self):
- print "%s 撒 " %self.name
- class Cat(Animal):
- def __init__(self, name):
- self.name = name
- self.breed = '猫'
- def cry(self):
- print '喵喵叫'
- class Dog(Animal):
- def __init__(self, name):
- self.name = name
- self.breed = '狗'
- def cry(self):
- print '汪汪叫'
- # ######### 执行 #########
- c1 = Cat('小白家的小黑猫')
- c1.eat()
- c2 = Cat('小黑的小白猫')
- c2.drink()
- d1 = Dog('胖子家的小瘦狗')
- d1.eat()
多继承~~
- class D:
- def bar(self):
- print 'D.bar'
- class C(D):
- def bar(self):
- print 'C.bar'
- class B(D):
- def bar(self):
- print 'B.bar'
- class A(B, C):
- def bar(self):
- print 'A.bar'
- a = A()
- # 执行bar方法时
- # 首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去D类中找,如果D类中么有,则继续去C类中找,如果还是未找到,则报错
- # 所以,查找顺序:A --> B --> D --> C
- # 在上述查找bar方法的过程中,一旦找到,则寻找过程立即中断,便不会再继续找了
- a.bar()
- class D(object):
- def bar(self):
- print 'D.bar'
- class C(D):
- def bar(self):
- print 'C.bar'
- class B(D):
- def bar(self):
- print 'B.bar'
- class A(B, C):
- def bar(self):
- print 'A.bar'
- a = A()
- # 执行bar方法时
- # 首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去C类中找,如果C类中么有,则继续去D类中找,如果还是未找到,则报错
- # 所以,查找顺序:A --> B --> C --> D
- # 在上述查找bar方法的过程中,一旦找到,则寻找过程立即中断,便不会再继续找了
- a.bar()
经典类:首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去D类中找,如果D类中么有,则继续去C类中找,如果还是未找到,则报错
新式类:首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去C类中找,如果C类中么有,则继续去D类中找,如果还是未找到,则报错
注意:在上述查找过程中,一旦找到,则寻找过程立即中断,便不会再继续找了
多态
Pyhon不支持多态并且也用不到多态,多态的概念是应用于Java和C#这一类强类型语言中,而Python崇尚“鸭子类型”。
- class F1:
- pass
- class S1(F1):
- def show(self):
- print 'S1.show'
- class S2(F1):
- def show(self):
- print 'S2.show'
- # 由于在Java或C#中定义函数参数时,必须指定参数的类型
- # 为了让Func函数既可以执行S1对象的show方法,又可以执行S2对象的show方法,所以,定义了一个S1和S2类的父类
- # 而实际传入的参数是:S1对象和S2对象
- def Func(F1 obj):
- """Func函数需要接收一个F1类型或者F1子类的类型"""
- print obj.show()
- s1_obj = S1()
- Func(s1_obj) # 在Func函数中传入S1类的对象 s1_obj,执行 S1 的show方法,结果:S1.show
- s2_obj = S2()
- Func(s2_obj) # 在Func函数中传入Ss类的对象 ss_obj,执行 Ss 的show方法,结果:S2.show
- class F1:
- pass
- class S1(F1):
- def show(self):
- print 'S1.show'
- class S2(F1):
- def show(self):
- print 'S2.show'
- def Func(obj):
- print obj.show()
- s1_obj = S1()
- Func(s1_obj)
- s2_obj = S2()
- Func(s2_obj)
以上就是本节对于面向对象初级知识的介绍,总结如下:
- 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用
- 类 是一个模板,模板中包装了多个“函数”供使用
- 对象,根据模板创建的实例(即:对象),实例用于调用被包装在类中的函数
- 面向对象三大特性:封装、继承和多态
python 学习分享-面向对象的更多相关文章
- python 学习分享-面向对象2
面向对象进阶 静态方法 一种普通函数,就位于类定义的命名空间中,它不会对任何实例类型进行操作.使用装饰器@staticmethod定义静态方法.类对象和实例都可以调用静态方法: class Foo: ...
- Python学习之==>面向对象编程(二)
一.类的特殊成员 我们在Python学习之==>面向对象编程(一)中已经介绍过了构造方法和析构方法,构造方法是在实例化时自动执行的方法,而析构方法是在实例被销毁的时候被执行,Python类成员中 ...
- python 学习分享-paramiko模块
paramiko模块学习分享 paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接.paramiko支持Linux, Solaris, BS ...
- python 学习分享-装饰器篇
本篇内容为偷窃的~哈哈,借用一下,我就是放在自己这里好看. 引用地址:http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html 第一步: ...
- Python学习一(面向对象和函数式编程)
学习了一周的Python,虽然一本书还没看完但是也收获颇多,作为一个老码农竟然想起了曾经荒废好久的园子,写点东西当做是学习笔记吧 对Python的语法看的七七八八了,比较让我关注的还是他编程的思想,那 ...
- 从0开始的Python学习014面向对象编程
简介 到目前为止,我们的编程都是根据数据的函数和语句块来设计的,面向过程的编程.还有一种我们将数据和功能结合起来使用对象的形式,使用它里面的数据和方法这种方法叫做面向对象的编程. 类和对象是面向对象 ...
- python学习 day23 面向对象三大特性之继承
### 面向对象三大特性值继承#### 1.什么是继承 继承是一种关系,必须存在两个对象才可能产生这种关系,在现实生活中的继承,王思聪可以继承王健林的财产 被继承的成为父,继承的一方成为子 在程序中, ...
- Python学习-day6 面向对象概念
开始学习面向对象,可以说之前的学习和编程思路都是面向过程的,从上到下,一步一步走完. 如果说一个简单的需求,用面向过程实现起来相对容易,但是如果在日常生产,面向对象就可以发挥出他的优势了. 程序的可扩 ...
- Python学习之面向对象基础
python的面向对象和以前学的c++,Java都是一般,大同小异,面向对象基础先谈谈类的构造,编写,属性和方法的可见性等等 1.定义类,创建和使用对象 #定义类 class Student(obje ...
随机推荐
- redis在Windows下以后台服务一键搭建集群(单机--伪集群)
redis在Windows下以后台服务一键搭建集群(单机--伪集群) 一.概述 此教程介绍如何在windows系统中同一台机器上布置redis伪集群,同时要以后台服务的模式运行.布置以脚本的形式,一键 ...
- 重置SQLSERVER表的自增列,让自增列重新计数【转】
很多时候我们需要重置某个表的自增列,让自增列重新从1开始记数.最蠢的方法当然是把该表删掉再重新建表了.其实,还有其它的方法可以重置自增列的值: 方法一:使用TRUNCATE TABLE语句: TRUN ...
- 数据类型 -- uint32_t 类型
整型的每一种都有无符号(unsigned)和有符号(signed)两种类型(float和double总是带符号的),在默认情况下声明的整型变量都是有符号的类型(char有点特别),如果需声明无符号类型 ...
- 梦织未来Windows驱动编程 第06课 驱动对磁盘文件的操作
代码部分: 实现一个文件C:\\text.txt,并读取写入内容到文件,然后将文件设置为只读,并隐藏文件.代码如下: //MyCreateFile.c //2016.07.22 #include &l ...
- 【硬盘整理】使用UltimateDefrag将常用文件放置在磁盘最外圈
使用方法未知.软件截图如下: 官方网站(英文):http://www.disktrix.com/ 汉化破解版V3.0下载地址:http://page2.dfpan.com/fs/7com9monca3 ...
- linux 命令——56 netstat(转)
netstat命令用于显示与IP.TCP.UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况.netstat是在内核中访问网络及相关信息的程序,它能提供TCP连接,TCP和UDP ...
- linux 命令——38 cal (转)
cal命令可以用来显示公历(阳历)日历.公历是现在国际通用的历法,又称格列历,通称阳历.“阳历”又名“太阳历”,系以地球绕行太阳一周为一年,为西方各国所通用,故又名“西历”. 1.命令格式: cal ...
- ascii码与unicode码的区别
ASCII(American Standard Code for Information Interchange,美国信息互换标准代码)是基于拉丁字母的一套电脑编码系统.它主要用于显示现代英语和其他西 ...
- 关于wp8.1 runtime模式下面的摄像头调用拍照问题和应用生命周期问题
现在的msdn文档,还找不到详细的wp8.1的摄像头拍照文档,只有一个序列拍照,类似九连拍的文档,而且这文档感觉就是windows8.1搬过来应付的,wp8.1模式,只要有一个地方处理不好,手机就会死 ...
- Objective-C try/catch异常处理机制原理。
try-catch-finaly finally在任何情况下都会执行(不管有没有异常),属于整个体系的附属. 基本思想是跳到捕获锚点,重新执行. http://www.cnblogs.com/mark ...