属性和方法查找顺序
多态性(多态绑定)是在有继承背景情况下使用的一种特性.
是指在不考虑实例背景的情况下使用实例
多态的理论根据是属性和方法的查找过程. 只要使用obj.attr
的方式使用属性和方法, 则查找顺序一定是: 对象本身, 类定义, 基类定义...
关于先查找对象本身的说明: 因为 python 是一门动态语言, 允许我们在代码执行的过程中去动态的给对象添加属性和方法, 所以先从对象本身查找.
class Father:
def __init__(self, name):
self.name = name
def speak(self):
print("我是父类中的 speak 方法" + self.name)
# Son继承 Father 类
class Son(Father):
def __init__(self, name, age):
Father.__init__(self, name)
self.age = age
def speak(self):
Father.speak(self)
print("我是子类的 speak 方法" + self.name + " 年龄:" + str(self.age))
def foo():
print("我是动态添加上去的...")
s = Son("李四", 20)
s.speak = foo
s.speak()
鸭子类型
python 的多态有的时候很多人把它称之为鸭子类型
鸭子类型是指: 看起来像鸭子, 叫起来像鸭子, 走起来像鸭子, 那么它既是鸭子, 你就可以把它当鸭子来用.
换成python编程语言的说法就是: 对象属性和方法在使用时和类型是分开的.
class A:
def speak(self):
print("a 类中的方法")
class B:
def speak(self):
print("b 类中的方法")
def foo(obj):
obj.speak()
a = A()
b = B()
foo(a)
foo(b)
说明:
foo
接受一个对象, 只要这个对象中有speak()
方法, 就可以正常执行, 我们并不关注他的类型A, B
这两个类没有任何的关系, 但是他们都有speak
方法, 所以传递过去都没有任何的问题.这就是鸭子模型, 只要你看起来有
speak
就可以了