python面向对象中的封装、继承、多态
封装
可以简单的理解为隐藏一切可以隐藏的实现细节,只向外界提供简单的编程接口。我们在类中定义的方法其实就是把数据和数据的操作封装起来了,在我们创建了对象之后,只需要给对象发送一个消息(调用方法)就可以执行方法中的代码,也就是说我们只需要知道方法的名字和传入的参数(方法的外部视图),而不需要知道方法内部的实现细节(方法的内部视图)。
练习:定义一个类实现一个数字数种
import time
class Clock:
def __init__(self):
# 获取当前系统时间
t = time.localtime()
self._hour = t.tm_hour
self._minute = t.tm_min
self._second = t.tm_sec
def run(self):
self._second += 1
if self._second == 60:
self._second = 0
self._minute += 1
if self._minute == 60:
self._minute = 0
self._hour += 1
if self._hour == 24:
self._hour = 0
def show(self):
return "%02d:%02d:%02d" % (self._hour, self._minute, self._second)
def main():
clock = Clock()
while True:
# 将光标退到当前行首
print("\r%s" % clock.show(), end="")
time.sleep(1)
clock.run()
if __name__ == '__main__':
main()
继承
在现实生活中,继承一般指的是子女继承父辈的财产,如下图
搞不好,结果如下..
在程序中继承是描述事物之间的所属关系,例如猫和狗都属于动物,程序中便可以描述为猫和狗继承自动物;同理,波斯猫和巴厘猫都继承自猫,而沙皮狗和斑点狗都继承自狗,如下如所示:
子类可以继承父类的公共属性和公共方法,父类中私有的属性和方法不能被继承。
单继承
一般只继承一个父类就叫做单继承,在java等静态语言中只能继承一个父类,也就不存在单继承和多继承了。
示例代码:
# 定义一个父类,如下:
class Cat(object):
def __init__(self, name, color="白色"):
self.name = name
self.color = color
def run(self):
print("%s--在跑"%self.name)
# 定义一个子类,继承Cat类如下:
class Bosi(Cat):
# 子类没有实现__init__方法,则自动调用父类的__init__方法
def setNewName(self, newName):
self.name = newName
def eat(self):
print("%s--在吃"%self.name)
bs = Bosi("印度猫")
print('bs的名字为:%s'%bs.name)
print('bs的颜色为:%s'%bs.color)
bs.eat()
bs.setNewName('波斯')
bs.run()
"""
输出结果:
bs的名字为:印度猫
bs的颜色为:白色
印度猫--在吃
波斯--在跑
"""
多继承
从图中能够看出,所谓多继承,即子类有多个父类,并且具有它们的特征。
多继承的格式如下:
# 定义一个父类
class A:
def printA(self):
print('----A----')
# 定义一个父类
class B:
def printB(self):
print('----B----')
# 定义一个子类,继承自A、B
class C(A,B):
def printC(self):
print('----C----')
obj_C = C()
obj_C.printA()
obj_C.printB()
"""
输出结果:
----A----
----B----
"""
如果在上面的多继承例子中,如果父类A和父类B中,有一个同名的方法,那么通过子类去调用的时候,调用哪个?
class A:
def print(self):
print('----A----')
class B:
def print(self):
print('----B----')
# 定义一个子类,继承自A、B
class C(A,B):
pass
obj_C = C()
obj_C.print()
"""
输出结果:
----A----
"""
事实上调用的顺序取决于C类先继承的是哪个类,先继承的类会先被调用。
也可通过__mor__查看C类的对象搜索方法时的先后顺序,接上面的代码
print(C.__mro__)
"""
输出结果:
(<class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>)
"""
重写父类的方法
所谓重写,就是子类中,有一个和父类相同名字的方法,在子类中的方法会覆盖掉父类中同名的方法
class Cat:
def sayHello(self):
print("halou-----1")
class Bosi(Cat):
def sayHello(self):
print("halou-----2")
class Bali(Cat):
def sayHello(self):
print("halou-----3")
bosi = Bosi()
bali= Bali()
bosi.sayHello()
bali.sayHello()
"""
输出结果:
halou-----2
halou-----3
"""
通过方法重写我们可以让父类的同一个行为在子类中拥有不同的实现版本,当我们调用这个经过子类重写的方法时,不同的子类对象会表现出不同的行为,这个就是多态(poly-morphism)。
调用父类的方法
class Cat:
def __init__(self,name):
self.name = name
class Bosi(Cat):
def __init__(self,name):
# 调用父类的__init__方法1(python2)
#Cat.__init__(self,name)
# 调用父类的__init__方法2
#super(Bosi,self).__init__(name)
# 调用父类的__init__方法3
super().__init__(name)
self.color = 'yellow'
def getName(self):
return self.name
bosi = Bosi('xiaohua')
print(bosi.name)
print(bosi.color)
"""
输出结果:
xiaohua
yellow
"""
总结:
- 上文说过如果在子类中需要父类的构造方法就需要显式地调用父类的构造方法,或者不重写父类的构造方法,子类不重写 __init __,实例化子类时,会自动调用父类定义的 __init __。
- 如果子类重写了__init__ 时,实例化子类,就不会调用父类已经定义的 __init __。
- 如果重写了__init __ 时,要继承父类的构造方法,可以使用如下方法:
- super(子类,self).init(参数1,参数2,....)
- 父类名称.init(self,参数1,参数2,...)
多态
多态的概念是应用于Java和C#这一类强类型语言中,而Python崇尚“鸭子类型”。
python面向对象中的封装、继承、多态的更多相关文章
- -1-2 java 面向对象基本概念 封装继承多态 变量 this super static 静态变量 匿名对象 值传递 初始化过程 代码块 final关键字 抽象类 接口 区别 多态 包 访问权限 内部类 匿名内部类 == 与 equal
java是纯粹的面向对象的语言 也就是万事万物皆是对象 程序是对象的集合,他们通过发送消息来相互通信 每个对象都有自己的由其他的对象所构建的存储,也就是对象可以包含对象 每个对象都有它的类型 也就是 ...
- 深入理解Java面向对象三大特性 封装 继承 多态
1.封装 封装的定义: 首先是抽象,把事物抽象成一个类,其次才是封装,将事物拥有的属性和动作隐藏起来,只保留特定的方法与外界联系 为什么需要封装: 封装符合面向对象设计原则的第一条:单一性原则,一个类 ...
- Python面向对象中的继承、多态和封装
Python面向对象中的继承.多态和封装 一.面向对象的三大特性 封装:把很多数据封装到⼀个对象中,把固定功能的代码封装到⼀个代码块, 函数,对象, 打包成模块. 这都属于封装思想. 继承:⼦类可以⾃ ...
- Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态)
Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态) 1.面向对象的三大特性: (1)继承 继承是一种创建新类的方式,在Python中,新建的类可以继承一个或多个父类,父类又可以 ...
- python面向对象(封装,继承,多态)
python面向对象(封装,继承,多态) 学习完本篇,你将会深入掌握 如何封装一个优雅的借口 python是如何实现继承 python的多态 封装 含义: 1.把对象的属性和方法结合成一个独立的单位, ...
- java面向对象(封装-继承-多态)
框架图 理解面向对象 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程强调的是功能行为 面向对象将功能封装进对象,强调具备了功能的对象. 面向对象是基于面向过程的. 面向对象的特点 ...
- php面向对象 封装继承多态 接口、重载、抽象类、最终类总结
1.面向对象 封装继承多态 接口.重载.抽象类.最终类 面向对象 封装继承多态 首先,在解释面向对象之前先解释下什么是面向对象? [面向对象]1.什么是类? 具有相同属性(特征)和方法(行为)的一 ...
- Java基础——面向对象(封装——继承——多态 )
对象 对象: 是类的实例(实现世界中 真 实存在的一切事物 可以称为对象) 类: 类是对象的抽象描述 步骤: 1.定义一个类 (用于 描述人:) ( * 人:有特征和行为) 2.根据类 创建对象 -- ...
- 浅谈学习C++时用到的【封装继承多态】三个概念
封装继承多态这三个概念不是C++特有的,而是所有OOP具有的特性. 由于C++语言支持这三个特性,所以学习C++时不可避免的要理解这些概念. 而在大部分C++教材中这些概念是作为铺垫,接下来就花大部分 ...
随机推荐
- CF#356 div2 C 猜数字
C. Bear and Prime 100 time limit per test 1 second memory limit per test 256 megabytes input standar ...
- [JZOJ6241]【NOI2019模拟2019.6.29】字符串【数据结构】【字符串】
Description 给出一个长为n的字符串\(S\)和一个长为n的序列\(a\) 定义一个函数\(f(l,r)\)表示子串\(S[l..r]\)的任意两个后缀的最长公共前缀的最大值. 现在有q组询 ...
- HDU 3480 Division DP斜率优化
解题思路 第一步显然是将原数组排序嘛--然后分成一些不相交的子集,这样显然最小.重点是怎么分. 首先,我们写出一个最暴力的\(DP\): 我们令$F[ i ][ j ] $ 为到第\(i\)位,分成\ ...
- vue中axios的封装(注意这里面异步的概念和用法十分重要)
todo https://www.cnblogs.com/chaoyuehedy/p/9931146.html
- 大哥带的XSS练习LEVE3
0X01DOM-XSS进阶之inner显式输出 首先我们先了解一下DOM型和和其他到底有什么区别 dom就是一个树状的模型,你可以编写Javascript代码根据dom一层一层的节点,去遍历/获取/修 ...
- java正则表达式详细总结
Java 提供了功能强大的正则表达式API,在java.util.regex 包下.本教程介绍如何使用正则表达式API. 正则表达式 一个正则表达式是一个用于文本搜索的文本模式.换句话说,在文本中搜索 ...
- 解决Cannot change version of project facet Dynamic Web Module to 3.1
Open web.xml from project structure http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version= ...
- 客户端浏览器向服务器发起http请求的全过程
http协议的参考:http://blog.csdn.net/hefeng6500/article/details/75081047 (1)浏览器先搜索自身的DNS缓存 (2)操作系统搜索自身的DNS ...
- asp.net 获取服务器及客户端的相关信息
1. 在ASP.NET中专用属性:获取服务器电脑名:Page.Server.ManchineName获取用户信息:Page.User获取客户端电脑名:Page.Request.UserHostName ...
- SAP MaxDB日常运维—启动、关闭、磁盘扩容
SAP MaxDB日常维护1.检查MaxDB状态,并启动su - pe0csccd /sapdb/SDB/db/bin./dbmcli -d SDB -u superdba,Mypassword db ...