python基础----多态与多态性、super函数用法、继承原理
一、多态与多态性
㈠多态:
多态指的是一类事物有多种形态,(一个抽象类有多个子类,因而多态的概念依赖于继承)
1. 序列类型有多种形态:字符串,列表,元组。
2. 动物有多种形态:人,狗,猪
import abc
class Animal(metaclass=abc.ABCMeta): #同一类事物:动物
@abc.abstractmethod
def talk(self):
pass class People(Animal): #动物的形态之一:人
def talk(self):
print('say hello') class Dog(Animal): #动物的形态之二:狗
def talk(self):
print('say wangwang') class Pig(Animal): #动物的形态之三:猪
def talk(self):
print('say aoao')
3. 文件有多种形态:文件文件,可执行文件
import abc
class File(metaclass=abc.ABCMeta): #同一类事物:文件
@abc.abstractmethod
def click(self):
pass class Text(File): #文件的形态之一:文本文件
def click(self):
print('open file') class ExeFile(File): #文件的形态之二:可执行文件
def click(self):
print('execute file')
4多态:同一种事物的多种形态,动物分为人类,猪类(在定义角度)
class Animal:
def run(self):
raise AttributeError('子类必须实现这个方法') class People(Animal):
def run(self):
print('人正在走') class Pig(Animal):
def run(self):
print('pig is walking') class Dog(Animal):
def run(self):
print('dog is running') peo1=People()
pig1=Pig()
d1=Dog() peo1.run()
pig1.run()
d1.run()
㈡多态性:
请务必注意注意注意:多态与多态性是两种概念.
多态性:一种调用方式,不同的执行效果
多态性是指具有不同功能的函数可以使用相同的函数名,这样就可以用一个函数名调用不同内容的函数。
在面向对象方法中一般是这样表述多态性:向不同的对象发送同一条消息,不同的对象在接收时会产生不同的行为(即方法)。也就是说,每个对象可以用自己的方式去响应共同的消息。所谓消息,就是调用函数,不同的行为就是指不同的实现,即执行不同的函数。
多态性分为静态多态性和动态多态性
静态多态性:如任何类型都可以用运算符+进行运算
动态多态性:如下
1.

2.
>>> def func(animal): #参数animal就是对态性的体现
... animal.talk()
...
>>> people1=People() #产生一个人的对象
>>> pig1=Pig() #产生一个猪的对象
>>> dog1=Dog() #产生一个狗的对象
>>> func(people1)
say hello
>>> func(pig1)
say aoao
>>> func(dog1)
say wangwang
3.
>>> def func(f):
... f.click()
...
>>> t1=Text()
>>> e1=ExeFile()
>>> func(t1)
open file
>>> func(e1)
execute file
4.
# 多态性依赖于:
# 1.继承
# 2.如下
##多态性:定义统一的接口,
def func(obj): #obj这个参数没有类型限制,可以传入不同类型的值
obj.run() #调用的逻辑都一样,执行的结果却不一样 func(peo1)
func(pig1) func(d1)
二、super函数用法
分别在python2和python3当中的用法
在python2中:
#coding:utf-8
#super在python2中的用法:
# 1:super(自己的类,self).父类的函数名字
# 2:super只能用于新式类
class People(object):
def __init__(self,name,sex,age):
self.name=name
self.age=age
self.sex=sex
def walk(self):
print('%s is walking' %self.name)
class Chinese(People):
country='China'
def __init__(self,name,sex,age,language='Chinese'):
# self.name=name
# self.sex=sex
# self.age=age
# People.__init__(self,name,sex,age)
super(Chinese,self).__init__(name,sex,age)
self.language=language
c=Chinese('egon','male',18)
print c.name,c.age,c.sex,c.language
在python3中:
#super在python3中的用法:
class People:
def __init__(self,name,sex,age):
self.name=name
self.age=age
self.sex=sex
def walk(self):
print('%s is walking' %self.name)
class Chinese(People):
country='China'
def __init__(self,name,sex,age,language='Chinese'):
# self.name=name
# self.sex=sex
# self.age=age
# People.__init__(self,name,sex,age)
super(Chinese,self).__init__(name,sex,age)
self.language=language
def walk(self,x):
super().walk()
print('子类的x',x)
c=Chinese('egon','male',18)
# print(c.name,c.age,c.sex,c.language)
c.walk(123)
三、继承原理
新式类的继承,在查找属性时遵循:广度优先 (python3中都是新式类)
python2中经典类的继承,在查找属性时遵循:深度优先
# coding:utf-8
# 新式类的继承,在查找属性时遵循:广度优先
class A(object):
def test(self):
print('from A')
pass
class B(A):
# def test(self):
# print('from B')
pass
class C(A):
# def test(self):
# print('from C')
pass
class D(B):
# def test(self):
# print('from D')
pass class E(C):
# def test(self):
# print('from E')
pass
class F(D,E):
# def test(self):
# print('from F')
pass
f1=F()
# f1.test() # print(F.__mro__) #只有新式类才有这个属性可以查看线性列表,经典类没有这个属性
print(F.mro()) # mro(method resolution order):方法解析顺序 # 广度优先:F->D->B->E->C->A->object #python2中经典类的继承,在查找属性时遵循:深度优先
class A:
# def test(self):
# print('from A')
pass
class B(A):
# def test(self):
# print('from B')
pass
class C(A):
# def test(self):
# print('from C')
pass
class D(B):
# def test(self):
# print('from D')
pass class E(C):
# def test(self):
# print('from E')
pass
class F(D,E):
# def test(self):
# print('from F')
pass
f1=F()
f1.test() # F->D->B->A->E->C
继承原理-例1
#新式类的继承,在查找属性时遵循:广度优先
class A(object):
def test(self):
print('from A')
pass
class X(A):
# def test(self):
# print('from X')
pass
class B(X):
# def test(self):
# print('from B')
pass
class C(A):
# def test(self):
# print('from C')
pass
class D(B):
# def test(self):
# print('from D')
pass class E(C):
# def test(self):
# print('from E')
pass
class F(D,E):
# def test(self):
# print('from F')
pass
f1=F()
f1.test() #广度优先:F->D->B->E->C->A->object
继承原理-例2
#新式类的继承,在查找属性时遵循:广度优先
class X(object):
# def test(self):
# print('from X')
pass
class Y(object):
# def test(self):
# print('from Y')
pass class B(X):
# def test(self):
# print('from B')
pass
class C(Y):
# def test(self):
# print('from C')
pass
class D(B):
# def test(self):
# print('from D')
pass class E(C):
# def test(self):
# print('from E')
pass
class F(D,E):
# def test(self):
# print('from F')
pass
f1=F()
f1.test() #F--->D---->B--->X--->E---->C---->Y---->object
继承原理-例3
#新式类的继承,在查找属性时遵循:广度优先
class A(object):
def test(self):
print('from A')
pass class B(A):
# def test(self):
# print('from B')
pass class C(A):
# def test(self):
# print('from C')
pass class D(A):
# def test(self):
# print('from D')
pass
class E(B):
# def test(self):
# print('from E')
pass
class F(C):
# def test(self):
# print('from F')
pass class G(D):
# def test(self):
# print('from G')
pass class H(E,F,G):
# def test(self):
# print('from H')
pass h1=H()
h1.test()
继承原理-例4
class A:
def fa(self):
print('from A')
def test(self):
self.fa()
class B(A):
def fa(self):
print('from B')
b=B()
b.test() #b.test--->B--->A b.fa()
继承原理-例5
灵魂画师(矮根儿)的杰作: 。◕‿◕。




python基础----多态与多态性、super函数用法、继承原理的更多相关文章
- python基础——多态与多态性
python基础--多态与多态性 1 多态 多态指的是一类事物有多种形态,(一个抽象类有多个子类,因而多态的概念依赖于继承) 1. 序列类型有多种形态:字符串,列表,元组. 2. 动物有多种形态:人, ...
- 第四章:Python基础の快速认识內置函数和操作实战
本課主題 內置函数介紹和操作实战 装饰器介紹和操作实战 本周作业 內置函数介紹和操作实战 返回Boolean值的內置函数 all( ): 接受一個可以被迭代的對象,如果函数裡所有為真,才會真:有一個是 ...
- Py修行路 python基础 (十三)匿名函数 与 内置函数
一.匿名函数 1.定义: 匿名函数顾名思义就是指:是指一类无需定义标识符(函数名)的函数或子程序. 2.语法格式:lambda 参数:表达式 lambda语句中,开头先写关键字lambda,冒号前是 ...
- python基础学习(六)函数基础
函数的基本使用 函数的定义 def 函数名(): 函数封装的代码 …… def 是英文 define 的缩写 函数名称 应该能够表达 函数封装代码 的功能,方便后续的调用 函数名称 的命名应该 符合 ...
- python基础之常用内置函数
前言 python有许多内置的函数,它们定义在python的builtins模块,在python的代码中可以直接使用它们. 常用的内置函数 类型转换 int python的整数类型都是int类型的实例 ...
- Python基础入门(5)- 函数的定义与使用
定义函数 函数的定义 函数的分类 函数的创建方法 函数的返回return 函数的定义 将一件事情的步骤封装在一起并得到最终结果 函数名代表了这个函数要做的事情 函数体是实现函数功能的流程 函数可以帮助 ...
- python 接口(抽象) 多态,鸭子类型, 多继承原理(mro)
抽象类与接口类 接口类 继承有两种用途: 一:继承基类的方法,并且做出自己的改变或者扩展(代码重用) 二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数 ...
- Py修行路 python基础 (十五)面向对象编程 继承 组合 接口和抽象类
一.前提回忆: 1.类是用来描述某一类的事物,类的对象就是这一类事物中的一个个体.是事物就要有属性,属性分为 1:数据属性:就是变量 2:函数属性:就是函数,在面向对象里通常称为方法 注意:类和对象均 ...
- Python 的多态与多态性
多态:是指一类事物有多种形态(!!!!定义角度!!!!) 多态性:在继承的基础上, (!!!!使用角度!!!!!) 使用多态性,实现了利用函数统一调用一个接口 多态 #多态:同一种事物的多种形态,动物 ...
随机推荐
- Appium 安卓计算器demo
package testProject; import org.openqa.selenium.*; import org.openqa.selenium.remote.DesiredCapabili ...
- zabbix搭建并结合mikoomi插件监控hadoop集群
一.环境说明 系统: CentOS release 6.4 mysql 5.1.67 Apache/2.2.25 二.安装php 由于zabbix提供的frontends是php编写的,因此需要搭建l ...
- 【python】详解time模块功能asctime、localtime、mktime、sleep、strptime、strftime、time等函数以及时间的加减运算
在Python中,与时间处理相关的模块有:time.datetime以及calendar.学会计算时间,对程序的调优非常重要,可以在程序中狂打时间戳,来具体判断程序中哪一块耗时最多,从而找到程序调优的 ...
- 算法笔记(c++)-使用递归函数逆序一个栈
---恢复内容开始--- 使用递归函数逆序一个栈 题目:使用递归函数,不借助其他数据结构逆序一个栈. 我的思路:使用递归函数保存栈中变量. 递归函数分两个,一个获取并移除栈底元素,另一个负责逆序.其实 ...
- 《JavaScript》web客户端存储
Web存储: 兼容IE8在内的所有主流浏览器,不兼容早期浏览器:支持大容量但非无限量 LocalStorage和sessionStorage是window对象的两个属性,这两个属性都代表同一个stor ...
- DP---(POJ1159 POJ1458 POJ1141)
POJ1159,动态规划经典题目,很适合初学者入门练手. 求:为了使字符串左右对称,应该插入的最小字符数目. 设字符串为S1 S2 S3 - Sn. 这个字符串有n个字符,根据DP的基本思路,减少问题 ...
- erlang node time ticket
Erlang doesn't detect net splits by itself. You could start looking atnet_kernel:set_net_ticktime/2 ...
- haproxy调度算法
调度算法详解 用balance指令指明调度算法, 例如:balance roundrobin 1:roundrobin :动态轮询算法,基于后端服务器的总权重做轮询,后端的服务器数量限制在4095 ...
- IDEA中Git的更新/提交/还原方法
记录一下在IDEA上怎样将写的代码提交到GitHub远程库: 下面这个图是基本的提交代码的顺序: 1. 将代码Add到stage暂存区本地修改了代码后,需先将代码add到暂存区,最后才能真正提价到gi ...
- [翻译]API Guides - Layouts
官方文档地址:http://developer.android.com/guide/topics/ui/declaring-layout.html PS:API Guides里面的内容不免都简单些,翻 ...