python基础----多态与多态性、super函数用法、继承原理
一、多态与多态性
㈠多态:
多态指的是一类事物有多种形态,(一个抽象类有多个子类,因而多态的概念依赖于继承)
1. 序列类型有多种形态:字符串,列表,元组。
2. 动物有多种形态:人,狗,猪
1 import abc 2 class Animal(metaclass=abc.ABCMeta): #同一类事物:动物 3 @abc.abstractmethod 4 def talk(self): 5 pass 6 7 class People(Animal): #动物的形态之一:人 8 def talk(self): 9 print('say hello') 10 11 class Dog(Animal): #动物的形态之二:狗 12 def talk(self): 13 print('say wangwang') 14 15 class Pig(Animal): #动物的形态之三:猪 16 def talk(self): 17 print('say aoao')
3. 文件有多种形态:文件文件,可执行文件
1 import abc 2 class File(metaclass=abc.ABCMeta): #同一类事物:文件 3 @abc.abstractmethod 4 def click(self): 5 pass 6 7 class Text(File): #文件的形态之一:文本文件 8 def click(self): 9 print('open file') 10 11 class ExeFile(File): #文件的形态之二:可执行文件 12 def click(self): 13 print('execute file')
4多态:同一种事物的多种形态,动物分为人类,猪类(在定义角度)
1 class Animal: 2 def run(self): 3 raise AttributeError('子类必须实现这个方法') 4 5 class People(Animal): 6 def run(self): 7 print('人正在走') 8 9 class Pig(Animal): 10 def run(self): 11 print('pig is walking') 12 13 class Dog(Animal): 14 def run(self): 15 print('dog is running') 16 17 peo1=People() 18 pig1=Pig() 19 d1=Dog() 20 21 peo1.run() 22 pig1.run() 23 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中:
1 #coding:utf-8 2 #super在python2中的用法: 3 # 1:super(自己的类,self).父类的函数名字 4 # 2:super只能用于新式类 5 class People(object): 6 def __init__(self,name,sex,age): 7 self.name=name 8 self.age=age 9 self.sex=sex 10 def walk(self): 11 print('%s is walking' %self.name) 12 class Chinese(People): 13 country='China' 14 def __init__(self,name,sex,age,language='Chinese'): 15 # self.name=name 16 # self.sex=sex 17 # self.age=age 18 # People.__init__(self,name,sex,age) 19 super(Chinese,self).__init__(name,sex,age) 20 self.language=language 21 c=Chinese('egon','male',18) 22 print c.name,c.age,c.sex,c.language
在python3中:
1 #super在python3中的用法: 2 class People: 3 def __init__(self,name,sex,age): 4 self.name=name 5 self.age=age 6 self.sex=sex 7 def walk(self): 8 print('%s is walking' %self.name) 9 class Chinese(People): 10 country='China' 11 def __init__(self,name,sex,age,language='Chinese'): 12 # self.name=name 13 # self.sex=sex 14 # self.age=age 15 # People.__init__(self,name,sex,age) 16 super(Chinese,self).__init__(name,sex,age) 17 self.language=language 18 def walk(self,x): 19 super().walk() 20 print('子类的x',x) 21 c=Chinese('egon','male',18) 22 # print(c.name,c.age,c.sex,c.language) 23 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
#新式类的继承,在查找属性时遵循:广度优先 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
#新式类的继承,在查找属性时遵循:广度优先 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
#新式类的继承,在查找属性时遵循:广度优先 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()
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()
灵魂画师(矮根儿)的杰作: 。◕‿◕。