面向对象:减少重复代码,提高效率,比函数式编程更高效

类的创建:

实例属性又称:成员变量,成员属性(或者字段)

面向对象的三大特性:

一、封装

把客观事物封装为抽象的类,并对外只暴露一个可用接口

使用构造方法将内容封装到对象中,可通过对象直接或者通过self间接获取被封装的内容

  1. # 创建类
  2. class Foo(object):
  3. def __init__(self, name, age): # 构造方法,根据创建的对象自动执行
  4. self.name = name
  5. self.age = age
  6.  
  7. # 类中的方法A
  8. def A(self):
  9. Foo.name = 'yeeh'
  10. print('hello!', self.name)
  11. print('hello!', Foo.name)
  12.  
  13. # 类中的方法B
  14. def B(self):
  15. print('word!',self.age)
  16.  
  17. obj = Foo('Vera', 18)
  18. obj.age = 12
  19. obj.A()
  20. obj.B()

  1. hello! Vera
  2. hello! yeeh
  3. word! 12

result

二、继承

子类拥有父类的全部方法,也可以对父类方法进行重写,并且可以定义自身的方法(一般到特殊,父类定义一些公共的方法,子类可定义自身特殊的方法)

  • 注:Python中一个子类可以继承多个父类

对于实例属性要进行 :先重写,再继承

  1. # 父类
  2. class People(object):
  3. number = 0
  4.  
  5. def __init__(self, name, age, sex):
  6. self.name = name
  7. self.age = age
  8. self.sex = sex
  9. self.drink() # 因为继承,所以调用的时候,都会打印drink ()里的东西
  10.  
  11. def eat(self):
  12. print('都可以吃东西!')
  13.  
  14. def drink(self):
  15. People.number += 1
  16. print('[%s].[%s] 的年龄是[%s]' % (People.number, self.name, self.age))
  17.  
  18. # 子类1
  19. class good_person(People):
  20. def __init__(self, name, age, sex, goodness): # 先重写
  21. super(good_person, self).__init__(name, age, sex) # 再继承
  22. self.goodness = goodness
  23.  
  24. def good_ness(self):
  25. print('善良的[%s]做好事' % self.name)
  26.  
  27. # 子类2
  28. class bad_person(People):
  29. def __init__(self, name, age, sex, sourness):
  30. super(bad_person, self).__init__(name, age, sex)
  31. self.sourness = sourness
  32.  
  33. def bad_ness(self):
  34. print('坏人[%s]做坏事!' % self.name)
  35.  
  36. g1 = good_person('花花', 23, '女', '做好事') # 实例化后因为父类的继承,所以直接会打印drink()
  37. g1.good_ness()
  38. b1 = bad_person('李刚', 33, '男', '做了坏事')
  39. b1.bad_ness()
  40. b1.eat() # 继承会继承父类的所有方法

继承

  1. [1].[花花] 的年龄是[23]
  2. 善良的[花花]做好事
  3. [2].[李刚] 的年龄是[33]
  4. 坏人[李刚]做坏事!
  5. 都可以吃东西!

result

注:

新式类 继承的写法:super(bad_person,self).__init__(name,age,sex)  # 利用关键字super

旧式(经典)类 继承的写法:People.__init__(self,name,age,sex)

有关super()继承:https://www.cnblogs.com/testview/p/4651198.html?utm_source=tuicool&utm_medium=referral

多继承:

  • 在3.0里及以后多继承的经典类和新式类都是采用的广度优先原则
  • 在3.0以下的版本,经典类和新式类就有深度和广度的区分

经典类:class A: 深度优先:继承了上一级里没有这个方法就直接到上一级的上一级去寻找,找到始祖没有找到,再从继承的上一级寻找再到它的始祖

新式类:class A(object): 广度优先  :继承的上一级,从左到右依次寻找继承的类里有没有那个方法,如果没有才再寻找上一级的上一级所继承的

  1. class A(object):
  2. def f1(self):
  3. print('我是 A')
  4.  
  5. class B(A):
  6. def f2(self):
  7. print('我是 B')
  8.  
  9. class C(A):
  10. def f3(self):
  11. print('我是 C')
  12.  
  13. class D(B, C):
  14. def f4(self):
  15. print('我是 D')
  16.  
  17. d = D()
  18. d.f1() # D->B->C->A
  19. d.f2() # D->B
  20. d.f3() # D->B->C
  21. d.f4() # D

新式类多继承

  1. class A:
  2. def f1(self):
  3. print('我是 A')
  4.  
  5. class B(A):
  6. def f2(self):
  7. print('我是 B')
  8.  
  9. class C(A):
  10. def f3(self):
  11. print('我是 C')
  12.  
  13. class D(B, C):
  14. def f4(self):
  15. print('我是 D')
  16.  
  17. d = D()
  18. d.f1() # D->B->A
  19. d.f2() # D->B
  20. d.f3() # D->B->A->C
  21. d.f4() # D

经典类多继承

  1. 我是 A
  2. 我是 B
  3. 我是 C
  4. 我是 D

result

三、多态

多态:当子类和父类都存在相同的方法时,子类的 方法 覆盖了父类的方法,在代码运行时,会调用子类的方法(一种调用方式,拥有不同的执行效果),把接口进行统一(外部调用,内部可以直接转换到相应方法下)

  1. class Animal(object):
  2. def func(self):
  3. print('这是Animal。。')
  4.  
  5. class dog(Animal):
  6. def func(self):
  7. print('这是dog。。')
  8.  
  9. class pig(Animal):
  10. def func(self):
  11. print('这是pig。。')
  12.  
  13. def run(self):
  14. print('这是pig中的run....')
  15.  
  16. def print_func(animal):
  17. animal.func()
  18.  
  19. A = Animal()
  20. d = dog()
  21. p = pig()
  22.  
  23. print_func(Animal()) # 对外只暴露一个接口,但是可以直接打印多个不同的东西
  24. print_func(dog())
  25. print_func(pig())

多态

  1. 这是Animal。。
  2. 这是dog。。
  3. 这是pig。。

result

Python_面向对象_类1的更多相关文章

  1. Python_面向对象_类2

    类的几个装饰器方法: @classmethod (类方法):使之无法访问实例变量 class Animal(object): def __init__(self, name): self.name = ...

  2. python中面向对象_类_对象的概念与定义

    1. 面向对象的概念,面向对象是一种编程思想. 是对现实世界中一类事物的抽象,在编程中可以理解为是一种建立现实世界事物的模型 2.  面向对象和面向过程的区别: 面向过程关注的是完成工作的步骤. 面向 ...

  3. java语言基础(四)_面向对象_类_对象_封装_构造

    面向对象 Java语言是一种面向对象的程序设计语言,而面向对象思想是一种程序设计思想,我们在面向对象思想的指引下,使用Java语言去设计.开发计算机程序. 这里的对象泛指现实中一切事物,每种事物都具备 ...

  4. Java核心基础第5篇-Java面向对象_类和对象

    Java面向对象之类和对象 一.面向对象概述 Java是完全的面向对象编程(Object Oriented Programming),简称OOP. 面向对象编程的思维方式更加符合大家的日常生活,因为我 ...

  5. python_面向对象_组合

    组合: 一个类的对象是另外一个类对象的属性 # 组合 # 一个类的对象是另一个类对象的属性 # 什么时候使用组合:当两个类之间的关系是 :什么有什么的关系 : 班级有学生 学生有班级 班级有课程 图书 ...

  6. Python_面向对象_单例模式

    class A(object): pass a1 = A() a2 = A() print(a1 == a2)print(id(a1))print(id(a2)) 结果: False 23257231 ...

  7. 黑马程序员_Java面向对象_内部类

    6.面向对象_内部类 1.内部类定义 内部类:将一个类定义在另一个类里面,对里面那个类就称为内部类.(内置类.嵌套类)内部类可以被私有修饰. 2.内部类访问规则 访问特点: 内部类可以直接访问外部类中 ...

  8. 【转】Python之面向对象与类

    [转]Python之面向对象与类 本节内容 面向对象的概念 类的封装 类的继承 类的多态 静态方法.类方法 和 属性方法 类的特殊成员方法 继承层级关系中子类的实例对象对属性的查找顺序问题 一.面向对 ...

  9. OC学习总结之面向对象和类

    OC学习总结之面向对象和类   Objective-c是c语言的母集合,它的原意就是在原始的c语言的主体上加入面向对象的特性.1.面向对象和面向过程  面向对象和面向过程是编程的两种思考方式.面向对象 ...

随机推荐

  1. Apollo 启动脚本解析

    Apollo 启动脚本解析 sudo service docker start -- 是在ubuntu14.04中打开 在dev_start.sh脚本中会调用restart_map_volume.sh ...

  2. PDF阅读器中如何改变线条颜色、线宽和线型等

    1.打开PDF阅读器过后,点击菜单栏"注释"这一栏,找到绘图区域中的线条或铅笔: 2.分别用线条和铅笔随意画两条直线,然后选中直线,右键点击直线并打开"属性": ...

  3. 如何将本地项目上传到Github

    看了这篇文章觉得写的很详细很适合初学者  提供给大家参考下. http://blog.csdn.net/zamamiro/article/details/70172900 注意如果第二次git pus ...

  4. PyJWT 使用

    最近要用 Falsk 开发一个大点的后端,为了安全考虑,弃用传统的Cookie验证.转用JWT. 其实 Falsk 有一个 Falsk-JWT 但是我觉得封装的太高,还是喜欢通用的 PyJWT . J ...

  5. Python-面向对象(组合、封装与多态)

    一.组合 什么是组合? 就是一个类的属性 的类型 是另一个自定义类的 类型,也可以说是某一个对象拥有一个属性,该属性的值是另一个类的对象. 通过为某一个对象添加属性(这里的属性是另一个类的对象)的方式 ...

  6. 点9图 Android设计中如何切图.9.png

    转载自:http://blog.csdn.net/buaaroid/article/details/51499516 本文主要介绍如何制作 切图.9.png(点9图),另一篇姊妹篇文章Android屏 ...

  7. winform数据存储的方式

    存储的方式有三种: 一.SQL数据库 二.Access(office 2007版本以上是需要安装驱动的) 三.XML

  8. IOS UINavigationController 更改返回按钮

    UIButton *back = [UIButton buttonWithType:UIButtonTypeCustom]; back.titleLabel.font = [UIFont boldSy ...

  9. Confluence 6 附件存储选项

    在早期的 Confluence 版本中,我们允许存储附件到 WebDav 或者 Confluence 数据库中.针对新的 Confluence 安装,我们不再支持这 2 种存储了. 本地文件系统 在默 ...

  10. embed标签详解

    HTML-embed标签详解 Embed(一).基本语法:embed src=url说明:embed可以用来插入各种多媒体,格式可以是 Midi.Wav.AIFF.AU.MP3等等,      Net ...