继承,即在定义一个类时,以另一个类为参数,则称这个新定义的类继承了参数类,父类又称为基类。

单继承表示只继承一个类,多继承表示继承多个类。

class parent1:
pass
class parent2:
pass
class sub1(parent1):#单继承
pass
class sub2(parent1,parent2):#多继承
pass

1.子类继承了父类的所有属性,可以调用父类的属性。

2.如果在子类中定义了与父类中相同的属性,相当于在自己的属性字典中增加了这些属性,而不是覆盖了父类的这些属性。

继承具有两种含义:

1.继承基类的方法,并且做出自己的改变或扩展(代码重用),不建议使用,会让子类与父类出现耦合。

2.声明某个子类继承于于某基类,定义一个接口,子类继承接口类,并且实现接口中定义的方法,接口就是一个函数。

即在父类中定义方法但是不指明接口的实现过程,子类继承这个接口并且指明的实现过程。

定义接口需要导入abc模块,并且在定义基类时添加metaclass=abc.ABCMeta,再在接口前用@abc.abstractmethod修饰即可。

import abc
class animal(metaclass=abc.ABCMeta): #定义基类时加metaclass=abc.ABCMeta参数
def __init__(self,name,leg):
self.name=name
self.leg=leg
@abc.abstractmethod #在接口前面加@abc.abstractmethod
def eat_food(self):
pass

class cat(animal):
#def eat_food(self):
#print('eat food') cat1=cat('cat1',4)
#报错信息Can't instantiate abstract class cat with abstract methods eat_food

如上述例子,cat类继承了animal类,在不具体化eat_food接口的情况下实例化会报错,去掉两行注释、即指定eat_food方法后才正常。

对于经典类,多继承情况下,会按照深度优先方式进行查找。

对于新式类,多继承情况下,会按照深度广度方式进行查找。python3都是新式类。

class a:
pass
def test(self):
print('a')
class b(a):
pass
# def test(self):
# print('b')
class c(a):
pass
# def test(self):
# print('c')
class d(a):
def test(self):
print('d')
class e(b):
pass
# def test(self):
# print('e')
class f(c):
pass
# def test(self):
# print('f')
class g(d):
pass
# def test(self):
# print('g')
class h(e,f,g):
pass
# def test(self):
# print('h')
print(h.__mro__)
h1=h()
h1.test() #h-->e-->b-->f-->c-->g-->d-->a

上述例子,a为基类,b、c、d继承a,e继承b,f继承c,g继承d,h继承e、f、g

可通过类的__mor__属性(经典类没有这个属性)查看类的继承顺序,结果为一个元组(<class '__main__.h'>, <class '__main__.e'>, <class '__main__.b'>, <class '__main__.f'>, <class '__main__.c'>, <class '__main__.g'>, <class '__main__.d'>, <class '__main__.a'>, <class 'object'>)

多态,即不同的实例调用类的方法,得到不同的结果。

class water:
def __init__(self,temperature):
self.temperature=temperature
def get_status(self):
if self.temperature<0:
print('The water of %s℃ is slolid ice'%self.temperature)
elif self.temperature>0 and self.temperature<100:
print('The water of %s is liquid water'%self.temperature)
elif self.temperature>100:
print('The water of %s is gas' % self.temperature) w1=water(-3)
w2=water(19)
w3=water(109)
w1.get_status()
w2.get_status()
w3.get_status()

封装

某个事物的数据属性和函数属性作为一个类,这个一个层面的封装。

类里面的属性使用_开头,这是python与使用者的约定,表示这个属性不应该被除类以外的实例使用,但只是约定,实例还是可以访问。如果在其他模块中通过import * 导入类,以_开头的属性不能被导入和调用,但是直接导入该属性还是可以使用的。

类里面的属性使用__开头,python会自动将这个属性重命名为_类名__属性名,实例不能直接通过原来的属性名访问,但是还是可以通过系统重命名后的名字访问。

class cat:
_type='animal' #以_开头的属性
__living='earth' #以__开头的属性
def __init__(self,name,leg,tail):
self.name = name
self.leg = leg
self.tail = tail
def eat(self,food):
print('%s likes to eat %s'%(self.name,food)) cat1=cat('cat1',4,1)
print(cat.__dict__) #{'__module__': '__main__', '_type': 'animal', '_cat__living': 'earth', '__init__':……
print(cat1._type) #以_开头的属性可以直接访问
#print(cat1.__living),会报错'cat' object has no attribute '__living'
print(cat1._cat__living) #以__开头的属性可通过重命名后的名字访问

python面向对象三大特性之一继承、多态、封装的更多相关文章

  1. python面向对象三大特性之继承

    继承是创建新类的方法,以下是几个概念 父类,基类,超类: 被继承的类 子类,派生类:继承而产出的类 单继承:继承一个父类 多继承:继承多个父类 继承: 什么是什么的关系 父类中没有的属性,在字类中出现 ...

  2. Python面向对象之:三大特性:继承,封装,多态以及类的约束

    前言: python面向对象的三大特性:继承,封装,多态. 1. 封装: 把很多数据封装到⼀个对象中. 把固定功能的代码封装到⼀个代码块, 函数, 对象, 打包成模块. 这都属于封装的思想. 具体的情 ...

  3. 面向对象编程(九)——面向对象三大特性之继承以及重写、Object类的介绍

    面向对象三大特性 面向对象三大特征:继承 :封装/隐藏 :多态(为了适应需求的多种变化,使代码变得更加通用!) 封装:主要实现了隐藏细节,对用户提供访问接口,无需关心方法的具体实现. 继承:很好的实现 ...

  4. python 面向对象三大特性(封装 多态 继承)

    今天我们来学习一种新的编程方式:面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)注:Java和C#来说只支持面向对象编程,而python比较灵活即支持面 ...

  5. python的面向对象的特性(继承、封装、多态)

    创建自已对象就python非常核心的概念,事实上,python被称为面向对象语言,本章会介绍如何创建对象.以及面向对象的概念:继承.封装.多态. 多态: 可对不同类的对象使用同样的操作. 封装:对外部 ...

  6. python面向对象-三大特性

    python面向对象编程三大特性 小结:前面我们说完了类和对象的关系,相信对类和对象的理解更加透彻..让我们一起去研究面向对象的三大特性吧.... 继承 1.什么继承? 在程序中继承就是事物之间的所属 ...

  7. python 面向对象(三大特性)

    python 面向对象(初级) (思维导图 ↑↑↑↑↑) 概述: 面向过程:根据业务逻辑从上到下垒代码. 函数式:将某功能代码封装至函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类 ...

  8. python面向对象三大特性

    面向对象的三大特性: 封装.继承和多态 一.封装 封装,顾名思义就是将内容封装到某个地方,以后可以直接调用被封装到某处的内容. - 将内容封装到某处 - 从某处调用被封装的内容 第一步,将内容封装到某 ...

  9. java 三大特性_继承、封装、多态_day005

    一.继承: java的三大特性之一.两个类之间通过extends关键字来描述父子关系,子类便可拥有父类的公共方法和公共属性.子类可以继承父类的方法和属性,子类也可以自己定义没有的方法或者通过覆盖父类的 ...

随机推荐

  1. CentOS6.5安装Tomcat8.0

    1.首先从官网下载最新的安装包 http://tomcat.apache.org/  apache-tomcat-8.0.20.tar.gz 2.上传安装包到 /usr/local/mypackage ...

  2. iOS 新浪微博-4.0 OAuth授权

    申请开发者 想要拉到到新浪微博的数据,首先让自己成为开发者.申请成为开发者账号很简单,只要有新浪微博的账号即可. 申请地址:http://open.weibo.com/ 在开发的过程中,我们需要拿到几 ...

  3. 定位amdu无法使用的根因并解决

    环境: OEL 5.7 + Oracle 10g + amdu_X86-64 现象: 我的两套实验环境,一套单实例,一套RAC,操作系统都是OEL 5.7,数据库都是Oracle 10g,上传同样的a ...

  4. 【转】Spotlight实时监控Windows Server 2008

    Windows Server 2008作为服务器平台已逐渐被推广和应用,丰富的功能和良好的稳定性为其赢得了不错的口碑.但是和Windows Server 2003相比,其系统的自我监控功能并没有多大的 ...

  5. 【2017-2-26】C#String类、Math类、DateTime类

    String类 黑色小扳手:属性      后面不带括号 紫色小箱子:方法      后面带小括号 1.字符串.Length;   字符串长度,返回int类型 字符串的长度 2.字符串.TrimSta ...

  6. laravel中使用的PDF扩展包——laravel-dompdf和laravel-snappy

    这两天项目中需要将HTML页面转换为PDF文件方便打印,我在网上搜了很多资料.先后尝试了laravel-dompdf和laravel-snappy两种扩展包,个人感觉laravel-snappy比较好 ...

  7. kalinux实现自适用全屏、与物理主机共享文件方法

    1.执行虚拟机>安装VMware Tools菜单命令,自动挂载光驱(一般是自动挂载的,如果没有自动挂载请自行百度linux如何手动挂载光驱) 2.打开vm光驱的vmtools复制此文件到桌面: ...

  8. spring aop 执行顺序

    aop 执行顺序: // @Before // @AfterThrowing order 值越小,执行时越靠前 // @After // @AfterReturning order 值越大,执行时越靠 ...

  9. Python使用闭包结合配置自动生成函数

    背景 在构建测试用例集时,常常需要编写一些函数,这些函数接受基本相同的参数,仅有一个参数有所差异,并且处理模式也非常相同.可以使用Python闭包来定义模板函数,然后通过参数调节来自动化生产不同的函数 ...

  10. IO多路复用 IO异步

    一.概念说明 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的环境给出的答案是不同的.所以先限定一下本文的环境.本文讨论的背景是Linux环境下的network I ...