一、面向对象了解

  面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。

  Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的。

面向对象编程

  OOP编程是利用“类”和“对象”来创建各种模型来实现对真实世界的描述,使用面向对象编程的原因一方面是因为它可以使程序的维护和扩展变得更简单,并且可以大大提高程序开发效率 ,另外,基于面向对象的程序可以使它人更加容易理解你的代码逻辑,从而使团队开发变得更从容
面向对象的几个核心特性如下
 
Class 类
  一个类即是对一类拥有相同属性的对象的抽象、蓝图、原型。在类中定义了这些对象的都具备的属性(variables(data))、共同的方法
 
Object 对象
  一个对象即是一个类的实例化后实例,一个类必须经过实例化后方可在程序中调用,一个类可以实例化多个对象,每个对象亦可以有不同的属性,就像人类是指所有人,每个人是指具体的对象,人与人之前有共性,亦有不同
 
Encapsulation 封装
  在类中对数据的赋值、内部调用对外部用户是透明的,这使类变成了一个胶囊或容器,里面包含着类的数据和方法
 
Inheritance 继承
  一个类可以派生出子类,在这个父类里定义的属性、方法自动被子类继承
 
Polymorphism 多态
  多态是面向对象的重要特性,简单点说:“一个接口,多种实现”,指一个基类中派生出了不同的子类,且每个子类在继承了同样的方法名的同时又对父类的方法做了不同的实现,这就是同一种事物表现出的多种形态。
编程其实就是一个将具体世界进行抽象化的过程,多态就是抽象化的一种体现,把一系列具体事物的共同点抽象出来, 再通过这个抽象的事物, 与不同的具体事物进行对话。对不同类的对象发出相同的消息将会有不同的行为。

  

二、类与对象

面向对象编程是一种编程方式,此编程方式的落地需要使用 “类” 和 “对象” 来实现,所以,面向对象编程其实就是对 “类” 和 “对象” 的使用。

类的创建:

  • 关键字:class
  • 创建对象:类名称后面加()
  1. # 创建类
  2. class Role(object):
  3.  
  4. def __init__(self): # 构造方法,见下文讲解
  5. pass
  6.  
  7. def show(self): # 类中函数的第一个参数必须是self,见下文讲解
  8. """
  9.  
  10. :return:
  11. """
  12. print("this is a role object")
  13.  
  14. r1 = Role() # 创建对象
  15. r1.show()

 类就是一个模板,模板中可以包含很多的函数

三、面向对象三大特性

面向对象三大特性:封装、继承、多态

一、封装

封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。

实现封装的步骤:

  • 将内容封装到某处
  • 从某处调用被封装的内容
    • 通过对象调用被封装的内容
    • 通过self间接调用被封装的内容
  1. def __init__(self, name, age): # 构造函数,有name和age两个属性
  2. self.name = name
  3. self.age = age
  4.  
  5. def show(self):
  6. """
  7. 展示信息
  8. :return:
  9. """
  10. print(self.name, self.age, sep=":") # 通过self间接调用被封装的属性值
  11.  
  12. def talk(self, info):
  13. """
  14. 说话
  15. :param info: 内容
  16. :return:
  17. """
  18. print(info)
  19.  
  20. p = People("小红", 18) # 创建对象,将值封装到name和age属性中
  21. print(p.age) # 通过对象调用属性值
  22. p.show() # python会默认将p传给self,即self.name ==> p.name,self.age==>p.age,即self代表的是类的实例即当前对象的地址

对于面向对象的封装来说,其实就是使用构造方法将内容封装到 对象 中,然后通过对象直接或者self间接获取被封装的内容

对象的私有属性和私有方法

  • 私有属性 就是 对象 不希望公开的 属性
  • 私有方法 就是 对象 不希望公开的 方法

定义方式:

  • 在 定义属性或方法时,在 属性名或者方法名前 增加 两个下划线,定义的就是 私有 属性或方法
  1. class Women(object):
  2.  
  3. def __init__(self, name):
  4. self.name = name
  5. self.__age = 18
  6.  
  7. def __secret(self):
  8. print("%s 的年龄是:%d" % (self.name, self.__age))
  9.  
  10. w1 = Women("小芳")
  11. w1.secret() # 私有方法不能直接方法
  12. print(w1.age) # 私有属性不能直接访问

  

python中没有真正意义上的私有:

  • 在给 属性方法 命名时,实际是对 名称 做了一些特殊处理,使得外界无法访问到
  • 处理方式:在 名称 前面加上 _类名 => _类名__名称
  1. class Women(object):
  2.  
  3. def __init__(self, name):
  4. self.name = name
  5. self.__age = 18
  6.  
  7. def __secret(self):
  8. print("%s 的年龄是:%d" % (self.name, self.__age))
  9.  
  10. w1 = Women("小芳")
  11. w1._Women__secret()
  12. print(w1._Women__age)

 可以通过以上方式访问私有属性和私有访问,不推荐使用

二、继承

继承:可以实现代码的重用,相同的代码不需要重复编写

继承的概念:子类拥有父类的所有方法和属性

继承的语法:

  1. class 类名(父类名):
  2. pass

 

  1. class Animal(object):
  2.  
  3. def __init__(self, name, age):
  4. self.name = name
  5. self.age = age
  6.  
  7. def eat(self):
  8. print("吃。。。%s, %d" % (self.name, self.age))
  9.  
  10. def drink(self):
  11. print("喝。。。")
  12.  
  13. def run(self):
  14. print("执行")
  15.  
  16. def __play(self):
  17. print("玩。。。")
  18.  
  19. class Dog(Animal):
  20.  
  21. def __init__(self, name, age):
  22. super().__init__(name, age)
  23.  
  24. def eat(self):
  25. super().eat() # Python3的使用父类方法的语法
  26. # Animal.eat(self) # python2的语法,python3依然支持,但不建议使用
  27. print("hahaha")
  28.  
  29. d = Dog("小狗", 12)
  30. d.eat()
  31. d.play() # 父类中私有属性和私有方法,子类不能继承

  

多继承

多继承语法:

  1. class 子类名(父类名1, 父类名2...)
  2. pass

  

如果父类之间存在通过的方法时,建议不要使用多继承

Python 中的 MRO —— 方法搜索顺序:

  用来查看方法的搜索顺序,主要用于多继承时判断方法、属性的调用路径:

  1. print(Dog.__mro__)
  2. # 执行结果
  3. <class '__main__.Dog'>, <class '__main__.Animal'>, <class 'object'>
  • 在搜索方法时,是按照 __mro__ 的输出结果 从左至右 的顺序查找的
  • 如果在当前类中 找到方法,就直接执行,不再搜索
  • 如果 没有找到,就查找下一个类 中是否有对应的方法,如果找到,就直接执行,不再搜索
  • 如果找到最后一个类,还没有找到方法,程序报错

三、多态

多态 不同的 子类对象 调用相同的 父类方法,产生不同的执行结果

  • 多态 可以 增加代码的灵活度
  • 以 继承 和 重写父类方法 为前提
  • 是调用方法的技巧,不会影响到类的内部设计
  1. class Dog(object):
  2.  
  3. def __init__(self, name):
  4. self.name = name
  5.  
  6. def game(self):
  7. print("%s 娱乐的玩耍...." % self.name)
  8.  
  9. class XiaoTianDog(Dog):
  10.  
  11. def __init__(self, name):
  12. super().__init__(name)
  13.  
  14. def game(self):
  15. print("%s 飞到天上玩" % self.name)
  16.  
  17. class Person(object):
  18.  
  19. def __init__(self, name):
  20. self.name = name
  21.  
  22. def game_with_dog(self, dog):
  23. print("%s 和 %s 快乐的玩耍" % (self.name, dog.name))
  24.  
  25. # 让狗玩耍
  26. dog.game() # 传入不同的子类对象,产生的执行结果不同
  27.  
  28. d1 = Dog("小花")
  29. d2 = XiaoTianDog("小白")
  30. xiaoming = Person("小明")
  31. xiaoming.game_with_dog(d1)
  32. xiaoming.game_with_dog(d2)

 多态更容易写出通用的代码,做出通用的编程,以适应变化的需求

四、类属性、静态方法、类方法

在python程序中,类是一个特殊的对象---类对象,类对象有自己的属性和方法,类属性和类方法,通过类名.的方式可以访问类属性和类方法。

类方法:可以在类中通过@classmethod对方法进行修饰

静态方法:可以在类中通过@staticmethod对方法进行修饰

  1. class Game(object):
  2.  
  3. # 游戏最高分,类属性
  4. top_score = 0
  5.  
  6. @staticmethod # 静态方法
  7. def show_help():
  8. print("帮助信息:让僵尸走进房间")
  9.  
  10. @classmethod    # 类方法
  11. def show_top_score(cls):
  12. print("游戏最高分是 %d" % cls.top_score)
  13.  
  14. def __init__(self, player_name):
  15. self.player_name = player_name
  16.  
  17. def start_game(self):
  18. print("[%s] 开始游戏..." % self.player_name)
  19.  
  20. # 使用类名.修改历史最高分
  21. Game.top_score = 999
  22.  
  23. # 1. 查看游戏帮助
  24. Game.show_help()
  25.  
  26. # 2. 查看游戏最高分
  27. Game.show_top_score()
  28.  
  29. # 3. 创建游戏对象,开始游戏
  30. game = Game("小明")
  31.  
  32. game.start_game()
  33.  
  34. # 4. 游戏结束,查看游戏最高分
  35. Game.show_top_score()

1.实例方法:方法内部可以访问实例属性

  实例方法内部可以使用类名.访问类属性 (不推荐使用)

2.类方法:方法内部只需要访问类属性

3.静态方法:方法内部,不需要访问实例属性和类属性

python学习【第九篇】python面向对象编程的更多相关文章

  1. Python学习-第三天-面向对象编程基础

    Python学习-第三天-面向对象编程基础 类和对象 简单的说,类是对象的蓝图和模板,而对象是类的实例.这个解释虽然有点像用概念在解释概念,但是从这句话我们至少可以看出,类是抽象的概念,而对象是具体的 ...

  2. python学习第九讲,python中的数据类型,字符串的使用与介绍

    目录 python学习第九讲,python中的数据类型,字符串的使用与介绍 一丶字符串 1.字符串的定义 2.字符串的常见操作 3.字符串操作 len count index操作 4.判断空白字符,判 ...

  3. python学习笔记15(面向对象编程)

    虽然Python是解释性语言,但是它是面向对象的,能够进行对象编程. 一.如何定义一个类 在进行python面向对象编程之前,先来了解几个术语:类,类对象,实例对象,属性,函数和方法. 类是对现实世界 ...

  4. Python学习札记(三十) 面向对象编程 Object Oriented Program 1

    参考:OOP NOTE 1.面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. ...

  5. Python学习之路——类-面向对象编程

    类 面向对象编程 通过类获取一个对象的过程 - 实例化 类名()会自动调用类中的__init__方法 类和对象之间的关系? 类 是一个大范围 是一个模子 它约束了事务有哪些属性 但是不能约束具体的值 ...

  6. Python学习第九篇——while和for的区别

    pets = ['dog','cat','dog','goldfish','cat','rabbit','cat'] print(pets) for pet in pets: print(pet) # ...

  7. Python 学习 第九篇:模块

    模块是把程序代码和数据封装的Python文件,也就是说,每一个以扩展名py结尾的Python源代码文件都是一个模块.每一个模块文件就是一个独立的命名空间,用于封装顶层变量名:在一个模块文件的顶层定义的 ...

  8. Python学习笔记四:面向对象编程

    一:定义类并创建实例 Python中定义类,通过class关键字,类名开头大写,参数列表为所继承的父类.如果没有需要明确继承的类,则继承object. 使用类来创建对象,只需 类名+() 形式即可,p ...

  9. Python学习札记(四十) 面向对象编程 Object Oriented Program 11

    参考:使用元类 NOTE: type() 1.type()函数可以用于检查一个类或者变量的类型. #!/usr/bin/env python3 class Myclass(object): " ...

  10. Python学习札记(三十七) 面向对象编程 Object Oriented Program 8 @property

    参考:@property NOTE 1.在绑定参数时,为了避免对属性不符合逻辑的操作,需要对传入的参数进行审核. #!/usr/bin/env python3 class MyClass(object ...

随机推荐

  1. Managed Media Aggregation using Rtsp and Rtp

    his article was written almost 2 years ago, it's content may not reflect the latest state of the cod ...

  2. 转:【AI每日播报】从TensorFlow到Theano:横向对比七大深度学习框架

    http://geek.csdn.net/news/detail/139235 说到近期的深度学习框架,TensorFlow火的不得了,虽说有专家在朋友圈大声呼吁,不能让TensorFlow形成垄断地 ...

  3. django dispatch

    from django.views import View # 这里Home需要继承View class Home(View): # 这样这里就相当于一个装饰器的功能,可以自己定制化内容 def di ...

  4. unity3D克隆50个游戏对象并输出Json格式的文本

    http://wenku.baidu.com/link?url=tl8q_aj1n-U267XkKtSZISaw6jKJ1woh4CJkDUr1AwEzllSAv7P0r7cawXXSyDVXNf6m ...

  5. TP视图命名规则之一

    TP视图命名规则之一   如果觉得目录结构太深,可以通过设置 TMPL_FILE_DEPR 参数来配置简化模板的目录层次,例如设置: 'TMPL_FILE_DEPR'=>'_' 默认的模板文件就 ...

  6. 【Java】Java_13 分支结构

    Java中常见的两种分支结构: <1>If语句:使用布尔表达式或者布尔类型值作为分支条件来进行分支控制. <2>switch语句:对多个整形值进行匹配,从而实现分支控制. 1. ...

  7. JavaScript 事件循环及异步原理(完全指北)

    引言 最近面试被问到,JS 既然是单线程的,为什么可以执行异步操作? 当时脑子蒙了,思维一直被困在 单线程 这个问题上,一直在思考单线程为什么可以额外运行任务,其实在我很早以前写的博客里面有写相关的内 ...

  8. Atitit。Cas机制 软件开发 编程语言 无锁机制 java c# php

    Atitit.Cas机制 软件开发 编程语言 无锁机制 java c# php 1. 为什么需要无锁操作1 2. 硬件支持 cas  atomic2 3. 无锁编程(Lock-Free)就是在某些应用 ...

  9. Angularjs学习笔记10_directive3

    1.      restrict M 使用模板 A 属性扩展 2.      template,templateUrl,$templateCache 模板缓存 //注射器加载完所有模块时,此方法执行一 ...

  10. iOS开发 多屏尺的自动适配(转)

    [iOS开发]多屏尺的自动适配 AutoLayout (纯代码方式) (2014-09-19 09:35:47) 转载▼ 标签: autolayout ios开发 xcode ui 分类: Xcode ...