好激动,学了四个月的面向对象,我终于勉勉强强的把作业做完了,现在来重构我的面向对象的知识!

  • 面向过程:根据业务逻辑从上到下写垒代码
  • 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可
  • 面向对象:对函数进行分类和封装,让开发“更快更好更强…”反正是类似于函数,但是比函数更牛逼

先看一段代码

  1. while True
  2. if cpu利用率 > 90%:
  3. #发送邮件提醒
  4. 连接邮箱服务器
  5. 发送邮件
  6. 关闭连接
  7.  
  8. if 硬盘使用空间 > 90%:
  9. #发送邮件提醒
  10. 连接邮箱服务器
  11. 发送邮件
  12. 关闭连接
  13.  
  14. if 内存占用 > 80%:
  15. #发送邮件提醒
  16. 连接邮箱服务器
  17. 发送邮件
  18. 关闭连接

再看一段

  1. def 发送邮件(内容)
  2. #发送邮件提醒
  3. 连接邮箱服务器
  4. 发送邮件
  5. 关闭连接
  6.  
  7. while True
  8.  
  9. if cpu利用率 > 90%:
  10. 发送邮件('CPU报警')
  11.  
  12. if 硬盘使用空间 > 90%:
  13. 发送邮件('硬盘报警')
  14.  
  15. if 内存占用 > 80%:
  16. 发送邮件('内存报警')

函数很好用啊!!!不用敲很多重复的代码,虽然我们是熟练工,但是能规避的还是要规避,毕竟农民伯伯都用机器了。


好啦,下面开始说正题了,比函数更牛逼,更好用的面向对象~~~~

  1. # 创建类
  2. class Foo:
  3.  
  4. def Bar(self):
  5. print 'Bar'
  6.  
  7. def Hello(self, name):
  8. print 'i am %s' %name
  9.  
  10. # 根据类Foo创建对象obj
  11. obj = Foo()
  12. obj.Bar() #执行Bar方法
  13. obj.Hello('wupeiqi') #执行Hello方法

面向对象三大特性

面向对象的三大特性是指:封装、继承和多态。

先看封装:

  1. class Foo:
  2.  
  3. def __init__(self, name, age):
  4. self.name = name
  5. self.age = age
  6.  
  7. obj1 = Foo('wupeiqi', 18)
  8. print obj1.name # 直接调用obj1对象的name属性
  9. print obj1.age # 直接调用obj1对象的age属性
  10.  
  11. obj2 = Foo('alex', 73)
  12. print obj2.name # 直接调用obj2对象的name属性
  13. print obj2.age # 直接调用obj2对象的age属性
  1. class Foo:
  2.  
  3. def __init__(self, name, age):
  4. self.name = name
  5. self.age = age
  6.  
  7. def detail(self):
  8. print self.name
  9. print self.age
  10.  
  11. obj1 = Foo('wupeiqi', 18)
  12. obj1.detail() # Python默认会将obj1传给self参数,即:obj1.detail(obj1),所以,此时方法内部的 self = obj1,即:self.name 是 wupeiqi ;self.age 是 18
  13.  
  14. obj2 = Foo('alex', 73)
  15. obj2.detail() # Python默认会将obj2传给self参数,即:obj1.detail(obj2),所以,此时方法内部的 self = obj2,即:self.name 是 alex ; self.age 是 78

好像很难理解的样子,但是多看,多写,多想,没难度!

  1. 练习一:在终端输出如下信息
  2.  
  3. 小明,10岁,男,上山去砍柴
  4. 小明,10岁,男,开车去东北
  5. 小明,10岁,男,最爱大保健
  6. 老李,90岁,男,上山去砍柴
  7. 老李,90岁,男,开车去东北
  8. 老李,90岁,男,最爱大保健
  9. 老张...
  1. def kanchai(name, age, gender):
  2. print "%s,%s岁,%s,上山去砍柴" %(name, age, gender)
  3.  
  4. def qudongbei(name, age, gender):
  5. print "%s,%s岁,%s,开车去东北" %(name, age, gender)
  6.  
  7. def dabaojian(name, age, gender):
  8. print "%s,%s岁,%s,最爱大保健" %(name, age, gender)
  9.  
  10. kanchai('小明', 10, '男')
  11. qudongbei('小明', 10, '男')
  12. dabaojian('小明', 10, '男')
  13.  
  14. kanchai('老李', 90, '男')
  15. qudongbei('老李', 90, '男')
  16. dabaojian('老李', 90, '男')
  1. class Foo:
  2.  
  3. def __init__(self, name, age ,gender):
  4. self.name = name
  5. self.age = age
  6. self.gender = gender
  7.  
  8. def kanchai(self):
  9. print "%s,%s岁,%s,上山去砍柴" %(self.name, self.age, self.gender)
  10.  
  11. def qudongbei(self):
  12. print "%s,%s岁,%s,开车去东北" %(self.name, self.age, self.gender)
  13.  
  14. def dabaojian(self):
  15. print "%s,%s岁,%s,最爱大保健" %(self.name, self.age, self.gender)
  16.  
  17. xiaoming = Foo('小明', 10, '男')
  18. xiaoming.kanchai()
  19. xiaoming.qudongbei()
  20. xiaoming.dabaojian()
  21.  
  22. laoli = Foo('老李', 90, '男')
  23. laoli.kanchai()
  24. laoli.qudongbei()
  25. laoli.dabaojian()
  1. 练习二:游戏人生程序
  2.  
  3. 1、创建三个游戏人物,分别是:
  4.  
  5. 苍井井,女,18,初始战斗力1000
  6. 东尼木木,男,20,初始战斗力1800
  7. 波多多,女,19,初始战斗力2500
  8. 2、游戏场景,分别:
  9.  
  10. 草丛战斗,消耗200战斗力
  11. 自我修炼,增长100战斗力
  12. 多人游戏,消耗500战斗力
  1. # -*- coding:utf-8 -*-
  2.  
  3. # ##################### 定义实现功能的类 #####################
  4.  
  5. class Person:
  6.  
  7. def __init__(self, na, gen, age, fig):
  8. self.name = na
  9. self.gender = gen
  10. self.age = age
  11. self.fight =fig
  12.  
  13. def grassland(self):
  14. """注释:草丛战斗,消耗200战斗力"""
  15.  
  16. self.fight = self.fight - 200
  17.  
  18. def practice(self):
  19. """注释:自我修炼,增长100战斗力"""
  20.  
  21. self.fight = self.fight + 200
  22.  
  23. def incest(self):
  24. """注释:多人游戏,消耗500战斗力"""
  25.  
  26. self.fight = self.fight - 500
  27.  
  28. def detail(self):
  29. """注释:当前对象的详细情况"""
  30.  
  31. temp = "姓名:%s ; 性别:%s ; 年龄:%s ; 战斗力:%s" % (self.name, self.gender, self.age, self.fight)
  32. print temp
  33.  
  34. # ##################### 开始游戏 #####################
  35.  
  36. cang = Person('苍井井', '女', 18, 1000) # 创建苍井井角色
  37. dong = Person('东尼木木', '男', 20, 1800) # 创建东尼木木角色
  38. bo = Person('波多多', '女', 19, 2500) # 创建波多多角色
  39.  
  40. cang.incest() #苍井空参加一次多人游戏
  41. dong.practice()#东尼木木自我修炼了一次
  42. bo.grassland() #波多多参加一次草丛战斗
  43.  
  44. #输出当前所有人的详细情况
  45. cang.detail()
  46. dong.detail()
  47. bo.detail()
  48.  
  49. cang.incest() #苍井空又参加一次多人游戏
  50. dong.incest() #东尼木木也参加了一个多人游戏
  51. bo.practice() #波多多自我修炼了一次
  52.  
  53. #输出当前所有人的详细情况
  54. cang.detail()
  55. dong.detail()
  56. bo.detail()

继承

爸爸和儿子的关系~

  1. class 猫:
  2.  
  3. def 喵喵叫(self):
  4. print '喵喵叫'
  5.  
  6. def 吃(self):
  7. # do something
  8.  
  9. def 喝(self):
  10. # do something
  11.  
  12. def 拉(self):
  13. # do something
  14.  
  15. def 撒(self):
  16. # do something
  17.  
  18. class 狗:
  19.  
  20. def 汪汪叫(self):
  21. print '喵喵叫'
  22.  
  23. def 吃(self):
  24. # do something
  25.  
  26. def 喝(self):
  27. # do something
  28.  
  29. def 拉(self):
  30. # do something
  31.  
  32. def 撒(self):
  33. # do something
  1. class 动物:
  2.  
  3. def 吃(self):
  4. # do something
  5.  
  6. def 喝(self):
  7. # do something
  8.  
  9. def 拉(self):
  10. # do something
  11.  
  12. def 撒(self):
  13. # do something
  14.  
  15. # 在类后面括号中写入另外一个类名,表示当前类继承另外一个类
  16. class 猫(动物):
  17.  
  18. def 喵喵叫(self):
  19. print '喵喵叫'
  20.  
  21. # 在类后面括号中写入另外一个类名,表示当前类继承另外一个类
  22. class 狗(动物):
  23.  
  24. def 汪汪叫(self):
  25. print '喵喵叫'
  1. class Animal:
  2.  
  3. def eat(self):
  4. print "%s 吃 " %self.name
  5.  
  6. def drink(self):
  7. print "%s 喝 " %self.name
  8.  
  9. def shit(self):
  10. print "%s 拉 " %self.name
  11.  
  12. def pee(self):
  13. print "%s 撒 " %self.name
  14.  
  15. class Cat(Animal):
  16.  
  17. def __init__(self, name):
  18. self.name = name
  19. self.breed '猫'
  20.  
  21. def cry(self):
  22. print '喵喵叫'
  23.  
  24. class Dog(Animal):
  25.  
  26. def __init__(self, name):
  27. self.name = name
  28. self.breed '狗'
  29.  
  30. def cry(self):
  31. print '汪汪叫'
  32.  
  33. # ######### 执行 #########
  34.  
  35. c1 = Cat('小白家的小黑猫')
  36. c1.eat()
  37.  
  38. c2 = Cat('小黑的小白猫')
  39. c2.drink()
  40.  
  41. d1 = Dog('胖子家的小瘦狗')
  42. d1.eat()

所以,对于面向对象的继承来说,其实就是将多个类共有的方法提取到父类中,子类仅需继承父类而不必一一实现每个方法。

注:除了子类和父类的称谓,你可能看到过 派生类 和 基类 ,他们与子类和父类只是叫法不同而已。

  1. class Animal:
  2.  
  3. def eat(self):
  4. print "%s 吃 " %self.name
  5.  
  6. def drink(self):
  7. print "%s 喝 " %self.name
  8.  
  9. def shit(self):
  10. print "%s 拉 " %self.name
  11.  
  12. def pee(self):
  13. print "%s 撒 " %self.name
  14.  
  15. class Cat(Animal):
  16.  
  17. def __init__(self, name):
  18. self.name = name
  19. self.breed '猫'
  20.  
  21. def cry(self):
  22. print '喵喵叫'
  23.  
  24. class Dog(Animal):
  25.  
  26. def __init__(self, name):
  27. self.name = name
  28. self.breed '狗'
  29.  
  30. def cry(self):
  31. print '汪汪叫'
  32.  
  33. # ######### 执行 #########
  34.  
  35. c1 = Cat('小白家的小黑猫')
  36. c1.eat()
  37.  
  38. c2 = Cat('小黑的小白猫')
  39. c2.drink()
  40.  
  41. d1 = Dog('胖子家的小瘦狗')
  42. d1.eat()

多继承~~

  1. class D:
  2.  
  3. def bar(self):
  4. print 'D.bar'
  5.  
  6. class C(D):
  7.  
  8. def bar(self):
  9. print 'C.bar'
  10.  
  11. class B(D):
  12.  
  13. def bar(self):
  14. print 'B.bar'
  15.  
  16. class A(B, C):
  17.  
  18. def bar(self):
  19. print 'A.bar'
  20.  
  21. a = A()
  22. # 执行bar方法时
  23. # 首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去D类中找,如果D类中么有,则继续去C类中找,如果还是未找到,则报错
  24. # 所以,查找顺序:A --> B --> D --> C
  25. # 在上述查找bar方法的过程中,一旦找到,则寻找过程立即中断,便不会再继续找了
  26. a.bar()
  1. class D(object):
  2.  
  3. def bar(self):
  4. print 'D.bar'
  5.  
  6. class C(D):
  7.  
  8. def bar(self):
  9. print 'C.bar'
  10.  
  11. class B(D):
  12.  
  13. def bar(self):
  14. print 'B.bar'
  15.  
  16. class A(B, C):
  17.  
  18. def bar(self):
  19. print 'A.bar'
  20.  
  21. a = A()
  22. # 执行bar方法时
  23. # 首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去C类中找,如果C类中么有,则继续去D类中找,如果还是未找到,则报错
  24. # 所以,查找顺序:A --> B --> C --> D
  25. # 在上述查找bar方法的过程中,一旦找到,则寻找过程立即中断,便不会再继续找了
  26. a.bar()

经典类:首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去D类中找,如果D类中么有,则继续去C类中找,如果还是未找到,则报错

新式类:首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去C类中找,如果C类中么有,则继续去D类中找,如果还是未找到,则报错

注意:在上述查找过程中,一旦找到,则寻找过程立即中断,便不会再继续找了

多态

Pyhon不支持多态并且也用不到多态,多态的概念是应用于Java和C#这一类强类型语言中,而Python崇尚“鸭子类型”。

  1. class F1:
  2. pass
  3.  
  4. class S1(F1):
  5.  
  6. def show(self):
  7. print 'S1.show'
  8.  
  9. class S2(F1):
  10.  
  11. def show(self):
  12. print 'S2.show'
  13.  
  14. # 由于在Java或C#中定义函数参数时,必须指定参数的类型
  15. # 为了让Func函数既可以执行S1对象的show方法,又可以执行S2对象的show方法,所以,定义了一个S1和S2类的父类
  16. # 而实际传入的参数是:S1对象和S2对象
  17.  
  18. def Func(F1 obj):
  19. """Func函数需要接收一个F1类型或者F1子类的类型"""
  20.  
  21. print obj.show()
  22.  
  23. s1_obj = S1()
  24. Func(s1_obj) # 在Func函数中传入S1类的对象 s1_obj,执行 S1 的show方法,结果:S1.show
  25.  
  26. s2_obj = S2()
  27. Func(s2_obj) # 在Func函数中传入Ss类的对象 ss_obj,执行 Ss 的show方法,结果:S2.show
  1. class F1:
  2. pass
  3.  
  4. class S1(F1):
  5.  
  6. def show(self):
  7. print 'S1.show'
  8.  
  9. class S2(F1):
  10.  
  11. def show(self):
  12. print 'S2.show'
  13.  
  14. def Func(obj):
  15. print obj.show()
  16.  
  17. s1_obj = S1()
  18. Func(s1_obj)
  19.  
  20. s2_obj = S2()
  21. Func(s2_obj)

以上就是本节对于面向对象初级知识的介绍,总结如下:

  • 面向对象是一种编程方式,此编程方式的实现是基于对  和 对象 的使用
  • 类 是一个模板,模板中包装了多个“函数”供使用
  • 对象,根据模板创建的实例(即:对象),实例用于调用被包装在类中的函数
  • 面向对象三大特性:封装、继承和多态

python 学习分享-面向对象的更多相关文章

  1. python 学习分享-面向对象2

    面向对象进阶 静态方法 一种普通函数,就位于类定义的命名空间中,它不会对任何实例类型进行操作.使用装饰器@staticmethod定义静态方法.类对象和实例都可以调用静态方法: class Foo: ...

  2. Python学习之==>面向对象编程(二)

    一.类的特殊成员 我们在Python学习之==>面向对象编程(一)中已经介绍过了构造方法和析构方法,构造方法是在实例化时自动执行的方法,而析构方法是在实例被销毁的时候被执行,Python类成员中 ...

  3. python 学习分享-paramiko模块

    paramiko模块学习分享 paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接.paramiko支持Linux, Solaris, BS ...

  4. python 学习分享-装饰器篇

    本篇内容为偷窃的~哈哈,借用一下,我就是放在自己这里好看. 引用地址:http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html 第一步: ...

  5. Python学习一(面向对象和函数式编程)

    学习了一周的Python,虽然一本书还没看完但是也收获颇多,作为一个老码农竟然想起了曾经荒废好久的园子,写点东西当做是学习笔记吧 对Python的语法看的七七八八了,比较让我关注的还是他编程的思想,那 ...

  6. 从0开始的Python学习014面向对象编程

     简介 到目前为止,我们的编程都是根据数据的函数和语句块来设计的,面向过程的编程.还有一种我们将数据和功能结合起来使用对象的形式,使用它里面的数据和方法这种方法叫做面向对象的编程. 类和对象是面向对象 ...

  7. python学习 day23 面向对象三大特性之继承

    ### 面向对象三大特性值继承#### 1.什么是继承 继承是一种关系,必须存在两个对象才可能产生这种关系,在现实生活中的继承,王思聪可以继承王健林的财产 被继承的成为父,继承的一方成为子 在程序中, ...

  8. Python学习-day6 面向对象概念

    开始学习面向对象,可以说之前的学习和编程思路都是面向过程的,从上到下,一步一步走完. 如果说一个简单的需求,用面向过程实现起来相对容易,但是如果在日常生产,面向对象就可以发挥出他的优势了. 程序的可扩 ...

  9. Python学习之面向对象基础

    python的面向对象和以前学的c++,Java都是一般,大同小异,面向对象基础先谈谈类的构造,编写,属性和方法的可见性等等 1.定义类,创建和使用对象 #定义类 class Student(obje ...

随机推荐

  1. redis在Windows下以后台服务一键搭建集群(单机--伪集群)

    redis在Windows下以后台服务一键搭建集群(单机--伪集群) 一.概述 此教程介绍如何在windows系统中同一台机器上布置redis伪集群,同时要以后台服务的模式运行.布置以脚本的形式,一键 ...

  2. 重置SQLSERVER表的自增列,让自增列重新计数【转】

    很多时候我们需要重置某个表的自增列,让自增列重新从1开始记数.最蠢的方法当然是把该表删掉再重新建表了.其实,还有其它的方法可以重置自增列的值: 方法一:使用TRUNCATE TABLE语句: TRUN ...

  3. 数据类型 -- uint32_t 类型

    整型的每一种都有无符号(unsigned)和有符号(signed)两种类型(float和double总是带符号的),在默认情况下声明的整型变量都是有符号的类型(char有点特别),如果需声明无符号类型 ...

  4. 梦织未来Windows驱动编程 第06课 驱动对磁盘文件的操作

    代码部分: 实现一个文件C:\\text.txt,并读取写入内容到文件,然后将文件设置为只读,并隐藏文件.代码如下: //MyCreateFile.c //2016.07.22 #include &l ...

  5. 【硬盘整理】使用UltimateDefrag将常用文件放置在磁盘最外圈

    使用方法未知.软件截图如下: 官方网站(英文):http://www.disktrix.com/ 汉化破解版V3.0下载地址:http://page2.dfpan.com/fs/7com9monca3 ...

  6. linux 命令——56 netstat(转)

    netstat命令用于显示与IP.TCP.UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况.netstat是在内核中访问网络及相关信息的程序,它能提供TCP连接,TCP和UDP ...

  7. linux 命令——38 cal (转)

    cal命令可以用来显示公历(阳历)日历.公历是现在国际通用的历法,又称格列历,通称阳历.“阳历”又名“太阳历”,系以地球绕行太阳一周为一年,为西方各国所通用,故又名“西历”. 1.命令格式: cal  ...

  8. ascii码与unicode码的区别

    ASCII(American Standard Code for Information Interchange,美国信息互换标准代码)是基于拉丁字母的一套电脑编码系统.它主要用于显示现代英语和其他西 ...

  9. 关于wp8.1 runtime模式下面的摄像头调用拍照问题和应用生命周期问题

    现在的msdn文档,还找不到详细的wp8.1的摄像头拍照文档,只有一个序列拍照,类似九连拍的文档,而且这文档感觉就是windows8.1搬过来应付的,wp8.1模式,只要有一个地方处理不好,手机就会死 ...

  10. Objective-C try/catch异常处理机制原理。

    try-catch-finaly finally在任何情况下都会执行(不管有没有异常),属于整个体系的附属. 基本思想是跳到捕获锚点,重新执行. http://www.cnblogs.com/mark ...