测试奇谭,BUG不见。

这一场主讲python的面向对象部分——封装、多态和继承

目的:掌握Python面向对象的三个核心概念。

封装

01 什么是封装?

封装的目的是,保护隐私。通俗的讲:不想让别人知道你的东西。

于是,便有了两个概念:普通属性(变量)和私有属性(变量)。

02 为什么要用封装?

当你不希望外界可以直接修改一些数据时。

比如用户的身份证号等信息属于用户的隐私,肯定不能直接暴露给外界直接访问或修改,那么就不能把它作为普通属性,应该作为私有属性。

03 怎么使用封装?

看下面这个例子就够了。

# !/usr/bin/python
# -*- coding:utf-8 -*-
class User:
def __init__(self, name, id_card):
# 普通属性
self.name = name
# 私有属性(双下划线)
self.__id_card = id_card def get_id_card(self):
return self.__id_card class Student(User):
def init(self, name, id_card):
# 普通属性
self.name = name
# 私有属性
self.__id_card = id_card # 实例化一个User类
user = User('张三', 511011199505050101)
stu = Student('李四', 511011199505050808) #print(user.__id_card)
# 不能直接访问私有属性,会报错:AttributeError: 'User' object has no attribute '__age'
print(user.get_id_card())
# 可以通过成员方法去访问私有属性 print(user._User__id_card)
# 也可以通过 “_类名__私有属性名” 进行访问

多态

01 什么是多态?

  • 多态指同一个实体同时具有多种形式。
  • 它是面向对象程序设计(OOP)的一个重要特征。
  • 同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。
  • 多态一般要通过继承和重写方法去实现。

太难理解?

说简单点:一类事物(动物)有多种形态(猫,狗,猪等)。

02 有什么用?

增加了程序的灵活性和扩展性,不论对象怎么变,调用方式不变。

太难理解?

那先了解下Python的多态实现,再来理解。

首先,Python 的多态是基于鸭子类型实现。

什么是鸭子类型?

如果一种动物只要行为有相似性,那么我们就可以认为是鸭子。

比如:鸭子会走路和游泳,是鸭子;人也会走路和游泳,也是“鸭子”

class duck():
def walk(self):
print('I walk, i am a duck') def swim(self):
print('i swim,i am a duck') class person():
def walk(self):
print('i walk like a duck') def swim(self):
print('i swim like a duck') def watch_duck(a):
a.walk()
a.swim() small_duck = duck()
watch_duck(small_duck)
# I walk, i am a duck
# i swim,i am a duck
duck_like_man = person()
watch_duck(duck_like_man)
# i walk like a duck
# i swim like a duck

watch_duck接收这个类的对象,但并没有检查对象的类型,便直接调用对象的walk和swim方法。

多态的灵活性和扩展性,便在于它关注的是调用对象如何被使用,而并不关注对象本身是什么。

即,我只关心你是否会走路和游泳,而不关心你究竟是谁。

说回灵活性和拓展性。当你再想增加一个类,比如狗,它也会走路和游泳 。

你只需要增加一个Dog类就可以了。

class Dog():
def walk(self):
print('i walk like a duck') def swim(self):
print('i swim like a duck')

继承

01 继承和重载

什么是继承?

动物需要吃和喝,猫继承自动物,则猫会吃和喝。

什么是重载?

动物需要吃和喝,猫继承自动物,则猫会吃和喝,但是猫喝水是用舔的,因此需要特殊处理(重载)一下。

class Animal:
def eat(self):
print("animal eat")
def drink(self):
print("animal drink") class Cat(Animal):
def drink(self):
print("cat drink by lick") cat = Cat()
cat.eat()
cat.drink()

02 多继承

什么是多继承?

小花是一个大学生(继承自学生),在校期间,她兼职做家教(继承自老师),于是,小花有两个能力(学习和教书)。

继承顺序(MRO查找)

Python支持多继承,但是有继承顺序:

菱形继承【类似广度优先查找】

class D:
def get(self):
print("I'm D") class B(D):
pass class C(D):
def get(self):
print("I'm C") class A(B, C):
pass
a = A()
a.get()
# I'm C

树型继承【类似深度优先查找】

class O:
def get(self):
print("I'm O")
class P:
def get(self):
print("I'm P")
class Z(O):
pass
class Y(P):
pass
class X(Z, Y):
pass
x = X()
x.get()
# I'm O

Python用C3算法处理多继承问题,我们可以用 _mro_ 来查看继承顺序。

print(A.__mro__)
# (<class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.D'>, <class 'object'>)
print(X.__mro__)
# (<class '__main__.X'>, <class '__main__.Z'>, <class '__main__.O'>, <class '__main__.Y'>, <class '__main__.P'>, <class 'object'>)

一如既往,做个总结

01 封装可以理解为保护隐私;

02 多态的关键是鸭子类型,明白了鸭子类型,理解多态不再困难;

03 继承可用,但多继承需要慎用,如果你非用不可,那必须得研究清楚继承的层次结构;

04 以上三点,是面向对象的核心,也是你日后工作中,会经常用到的,so,它们很重要。

python极简教程07:封装、多态和继承的更多相关文章

  1. Python 极简教程(八)字符串 str

    由于字符串过于重要,请认真看完并保证所有代码都至少敲过一遍. 对于字符串,前面在数据类型中已经提到过.但是由于字符串类型太过于常用,Python 中提供了非常多的关于字符串的操作.而我们在实际编码过程 ...

  2. python极简教程04:进程和线程

    测试奇谭,BUG不见. 大家好,我是谭叔. 这一场,主讲python的进程和线程. 目的:掌握初学必须的进程和线程知识. 进程和线程的区别和联系 终于开始加深难度,来到进程和线程的知识点~ 单就这两个 ...

  3. python极简教程01:基础变量

    测试奇谭,BUG不见. 其实很久之前,就有身边的同事或者网友让我分享一些关于python编程语言的教程,他们同大多数自学编程语言的人一样,无外乎遇到以下这些问题: 网络上的资料过多且良莠不全,不知道如 ...

  4. Python 极简教程(一)前言

    现在 Python 用处很多,学的人也很多,其流行程度自不必说.但是很多人学 Python 的时候都遇到过问题,特别对于非计算机专业毕业的人来说. 现在的教程非常多,但是绝大部分对于初学者都不够友好. ...

  5. Python 极简教程(十三)while 循环

    循环简单来说就是让一段代码按你想要的方式多次运行.软件拥有强大的运算能力,就是由循环提供的. 在 Python 中支持的循环由两种:while 循环 和for 循环. 现在我们先来讲while循环. ...

  6. Python 极简教程(三)数据类型

    每种语言都有各种数据类型.这就像在现实生活中,我们计数的时候需要用到数字,在表述金额.重量.距离等需要精确计数时用到小数,在日常交谈中要用文字,等等.在计算机语言中,为了表述不同的情况,也需要用到各种 ...

  7. Python 极简教程(二)编码工具

    Python 的编码工具很多.目前最流行的是 pycharm,关于 pycharm 的安装使用请参考 PyCharm安装使用教程. 而学习过程中,我觉得最好用的,还是 Python 自带的练习工具 I ...

  8. python极简教程05:生成器和匿名函数

    测试奇谭,BUG不见. 讲解之前,我先说说我的教程和网上其他教程的区别: 1 我分享的是我在工作中高频使用的场景,是精华内容: 2 我分享的是学习方法,亦或说,是指明你该学哪些.该重点掌握哪些内容: ...

  9. python极简教程08:对象的方法

    测试奇谭,BUG不见. 讲解之前,我先说说我的教程和网上其他教程的区别: 1 我分享的是我在工作中高频使用的场景,是精华内容: 2 我分享的是学习方法,亦或说,是指明你该学哪些.该重点掌握哪些内容: ...

随机推荐

  1. Tornado.web.Application之-settings

    应用程序配置 class  tornado.web.Application(handlers:List [Union [Rule,Tuple]] = None,default_host:str = N ...

  2. SpringBoot整合knife4j框架(可生成离线接口文档),并设置接口请求头token默认值

    功能和swagger类似 官网地址:https://doc.xiaominfo.com/knife4j/ 这个框架可以设置返回字段的描述 引入依赖 <dependency> <gro ...

  3. js控制滚动条在最底部位置

    window.scrollTo(0, document.body.scrollHeight) 如果需要始终保持在最底部,可以循环调用该方法 如果是div的 /*滚动条到地步*/ function to ...

  4. Matrix(poj2155)

    Matrix Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 25139   Accepted: 9314 Descripti ...

  5. 1289 - LCM from 1 to n

    http://blog.csdn.net/acdreamers/article/details/18507767 这个是位图的链接,这篇写的挺好. 模板: 1 #include<math.h&g ...

  6. Docker 与 K8S学习笔记(三)—— 镜像的使用

    前面的文章介绍过镜像的三种获取方式: 下载并使用别人创建好的镜像: 在现有镜像上创建新的镜像: 从无到有创建镜像. 本文主要介绍前两种. 一.下载镜像 在Docker Hub上有大量优质镜像可以使用, ...

  7. Java锁与非阻塞算法的性能比较与分析+原子变量类的应用

    15.原子变量与非阻塞同步机制 在java.util.concurrent包中的许多类,比如Semaphore和ConcurrentLinkedQueue,都提供了比使用Synchronized更好的 ...

  8. Essentially No Barriers in Neural Network Energy Landscape

    目录 梗概 主要内容 path的定义 path的逼近 Mechanical Model Nudged Elastic Band 局部最优 Draxler F, Veschgini K, Salmhof ...

  9. 读书笔记markdown模板

    读书笔记 书名 作者 出版社 阅读日期 书籍背景 书摘/ 笔记 批注 总结& 收获 读完每一本书,把书中的知识转化为「自己的智慧」,才是最扎实的收获- 他山之石 摘录相关精彩书评-

  10. Vue.js高效前端开发 • 【Vue组件】

    全部章节 >>>> 文章目录 一.Vue组件介绍 1.组件概述 2.组件使用步骤 3.实践练习 一.Vue组件使用 1.组件注册 2.组件注册语法糖 3.使用script或te ...