python极简教程07:封装、多态和继承
测试奇谭,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:封装、多态和继承的更多相关文章
- Python 极简教程(八)字符串 str
由于字符串过于重要,请认真看完并保证所有代码都至少敲过一遍. 对于字符串,前面在数据类型中已经提到过.但是由于字符串类型太过于常用,Python 中提供了非常多的关于字符串的操作.而我们在实际编码过程 ...
- python极简教程04:进程和线程
测试奇谭,BUG不见. 大家好,我是谭叔. 这一场,主讲python的进程和线程. 目的:掌握初学必须的进程和线程知识. 进程和线程的区别和联系 终于开始加深难度,来到进程和线程的知识点~ 单就这两个 ...
- python极简教程01:基础变量
测试奇谭,BUG不见. 其实很久之前,就有身边的同事或者网友让我分享一些关于python编程语言的教程,他们同大多数自学编程语言的人一样,无外乎遇到以下这些问题: 网络上的资料过多且良莠不全,不知道如 ...
- Python 极简教程(一)前言
现在 Python 用处很多,学的人也很多,其流行程度自不必说.但是很多人学 Python 的时候都遇到过问题,特别对于非计算机专业毕业的人来说. 现在的教程非常多,但是绝大部分对于初学者都不够友好. ...
- Python 极简教程(十三)while 循环
循环简单来说就是让一段代码按你想要的方式多次运行.软件拥有强大的运算能力,就是由循环提供的. 在 Python 中支持的循环由两种:while 循环 和for 循环. 现在我们先来讲while循环. ...
- Python 极简教程(三)数据类型
每种语言都有各种数据类型.这就像在现实生活中,我们计数的时候需要用到数字,在表述金额.重量.距离等需要精确计数时用到小数,在日常交谈中要用文字,等等.在计算机语言中,为了表述不同的情况,也需要用到各种 ...
- Python 极简教程(二)编码工具
Python 的编码工具很多.目前最流行的是 pycharm,关于 pycharm 的安装使用请参考 PyCharm安装使用教程. 而学习过程中,我觉得最好用的,还是 Python 自带的练习工具 I ...
- python极简教程05:生成器和匿名函数
测试奇谭,BUG不见. 讲解之前,我先说说我的教程和网上其他教程的区别: 1 我分享的是我在工作中高频使用的场景,是精华内容: 2 我分享的是学习方法,亦或说,是指明你该学哪些.该重点掌握哪些内容: ...
- python极简教程08:对象的方法
测试奇谭,BUG不见. 讲解之前,我先说说我的教程和网上其他教程的区别: 1 我分享的是我在工作中高频使用的场景,是精华内容: 2 我分享的是学习方法,亦或说,是指明你该学哪些.该重点掌握哪些内容: ...
随机推荐
- 资源分配(Project)
<Project2016 企业项目管理实践>张会斌 董方好 编著 资源设置好以后,不能光摆着看,分配到各任务中去才是正道. 分配资源就需要回到与任务相关的视图了,比如[任务工作表]视图或者 ...
- Spring5 概述及Spring IOC学习
Spring Framework 5 1. Spring框架 1.1 Spring框架概述 1.2 主要内容 Spring框架是一个开源的JavaEE的应用程序 主要核心是 IOC(控制反转)和AOP ...
- LuoguP1723 高手过愚人节 题解
Content 有 \(n\) 次询问,每次询问给定一个字符串 \(s\),求这个字符串最长的回文子串的长度. 数据范围:\(n\) 无解(至少从题面来看是这样的),字符串长度目测应该在 \(10^7 ...
- 金山云主机centos7.4根目录挂载文件书写错误无法进入系统解决办法
由于/etc/fstab写错,根目录无法挂载,开机提示如下 处理办法: 根据提示输入root密码: 执行mount -o remount,rw /重新挂载根目录. vim 修改挂载文件 reboot重 ...
- 【LeetCode】98. Validate Binary Search Tree 解题报告(Python & C++ & Java)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归 BST的中序遍历是有序的 日期 题目地址:ht ...
- [LeetCode]621. Task Scheduler 任务安排 题解
题目描述 给定一个char数组,代表CPU需要做的任务,包含A-Z,不用考虑顺序,每个任务能在1个单位完成.但是有规定一个非负整数n代表两个相同任务之间需要至少n个时间单位.球最少数量的时间单位完成所 ...
- A1. 道路修建 Small(BNUOJ)
A1. 道路修建 Small Time Limit: 1000ms Memory Limit: 131072KB 64-bit integer IO format: %lld Java cl ...
- Docker 与 K8S学习笔记(九)—— 容器间通信
容器之间可通过IP.Docker DNS Server或joined三种方式进行通信,今天我们来详细学习一下. 一.IP通信 IP通信很简单,前一篇中已经有所涉及了,只要容器使用相同网络,那么就可以使 ...
- 从零搭建react hooks项目(github有源代码)
前言 首先这是一个react17的项目,包含项目中常用的路由.状态管理.less及全局变量配置.UI等等一系列的功能,开箱即用,是为了以后启动项目方便,特地做的基础框架,在这里分享出来. 这里写一下背 ...
- Masked Gradient-Based Causal Structure Learning
目录 概 主要内容 最终的目标 代码 Ng I., Fang Z., Zhu S., Chen Z. and Wang J. Masked Gradient-Based Causal Structur ...